0

I am learning Java Swing. I followed a YouTube lectures playlist that provided this github code for drawing graphs. I am providing the basic structure here:

package graphapp;
import com.sun.corba.se.impl.orbutil.graph.Graph;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import javax.swing.JComboBox;
import javax.swing.JFrame;
public class GraphApp extends JFrame {

    int x,y;
    int ax,by;
    JComboBox cb,cb1;
    String s="";
    String se ="";

   public GraphApp(){ 
    setTitle("Graph App");
    setSize(900,700);
    String[] graphs = {"select..","parabola","ax^2+bx+c","ax^3","y=mx","y=mx+c","sin(x)","cos(x)","tan(x)","sinc function","signum(x)","X-graph","cubic         function","sin+cos unequal amp","sin^3","cos^3","sin^3+cos^3","Amplitude Modulation"};
    cb = new JComboBox(graphs);

    cb.setBounds(700, 100, 120, 25);
    add(cb);
    cb.setEditable(false);
    String[] select = {"Draw graph","Erase"};
    cb1 = new JComboBox(select);

    cb1.setBounds(700, 150, 120, 25);
    add(cb1);
    cb1.setEditable(false);

    setLayout(null); //add it its very important otherwise Combo Box will occupy the whole screen.

    setVisible(true);
    setResizable(false);
    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    x = 30; //x=200;
    y = 300;
}
public void paint(Graphics g){

    super.paint(g); //This method was not called in The Master Branch at github
    g.setColor(Color.BLACK);
    g.drawString("Design by ..", 700, 400);
    g.drawString("Debasish Roy", 700, 420);
    g.drawString("Y", 310, 40);
    g.drawString("Y'", 310, 600);
    g.drawString("X", 30, 314);
    g.drawString("X'", 600, 314);
    if(x==300&&y==300){
        g.drawString("Origin(0,0)", 310, 314);
    }
    g.drawString("Select Graphs", 710, 100);
    g.drawLine(300, 30, 300, 600);
    g.drawLine(30,300,600,300);
    if(x>599||y<40){
        g.drawString((String) cb.getSelectedItem(), 200, 200);
        s= String.valueOf(cb.getSelectedItem());
        se = String.valueOf( cb1.getSelectedItem());
        x=30;
        y=300;

    }                        
    if(s.equals("parabola")&& se.equals("Draw graph")){
        g.setColor(Color.GREEN);
        run1(); // function to set x and y values  
            }
    //Other checks to find the type of graph selected
        else{
        g.setColor(Color.white);
        run();
    }
    g.fillOval(x, y, 3, 3);
    repaint(); // When I run this code, the window keeps flickering. I think it is because this method called without any check.
                //However I don't know much about this method

}

public void run(){
    try{
        Thread.sleep(1);
        if(x<600&&y>30&&y!=600){
             ax = x-300;
             by = y-300;
                  ax++;

                 by = (int) (40*(1+1*Math.cos(.2*ax/3.14))*Math.cos(ax/3.14)+40*(40*Math.sin(.2*ax/3.14))/ax); // AM+sinc(x) function
            x=300+ax;
            y=300-by;

        }

    }catch(Exception e){
        System.out.println("ERROR");
    }
}

public static void main(String[] args){
    new GraphApp();
    Thread t1 = new Thread();
             t1.start();
}

}

When I run this code, no graph gets drawn. Also, when I change selection in JComboBox no change is detected. Please help me what am I missing to grab here.

Faizi
  • 410
  • 1
  • 8
  • 13
  • 1
    1) *`setLayout(null); //add it its very important otherwise Combo Box will occupy the whole screen.` No. Learn how to use layouts properly. Java GUIs have to work on different OS', screen size, screen resolution etc. using different PLAFs in different locales. As such, they are not conducive to pixel perfect layout. Instead use layout managers, or [combinations of them](http://stackoverflow.com/a/5630271/418556) along with layout padding and borders for [white space](http://stackoverflow.com/a/17874718/418556). .. – Andrew Thompson Nov 25 '18 at 12:44
  • 1
    .. 2) Provide ASCII art or a simple drawing of the *intended* layout of the GUI at minimum size, and if resizable, with more width and height - to show how the extra space should be used. 3) For better help sooner, [edit] to add a [MCVE] or [Short, Self Contained, Correct Example](http://www.sscce.org/). Replace the `Graph` with a plain `JPanel` for starters. – Andrew Thompson Nov 25 '18 at 12:44
  • The code is "bad" in many ways. You should **not** use this to learn from it. Have a look at some answers here, e.g. https://stackoverflow.com/questions/8693342/drawing-a-simple-line-graph-in-java – Marco13 Nov 25 '18 at 16:43

1 Answers1

1

When I run this code, no graph gets drawn.

  1. You should NOT be overriding paint(...) on a JFrame. Custom painting is done by overriding paintComponent(...) of a JPanel and then you add the panel to the frame. Read the section from the Swing tutorial on Custom Painting for more information and working examples to get you started.

  2. A painting method is for painting only. You should NOT invoke repaint(). Swing will determine when a component needs to repaint itself or you invoke repaint() in an external method. The painting code should only paint the current state of the component. If you have properties that change then you need methods to change those properties and then repaint() the component.

  3. You should NOT invoke Thread.sleep() in a painting method.

  4. You are creating a Thread that does nothing. You need to pass a runnable object to the Thread if you want to execute code when the Thread starts. However, in this case if you want animation of the graph then you should be using a Swing Timer for the animation. When the Timer fires you update the properties of your class and then invoke repaint().

Also, when I change selection in JComboBox no change is detected.

You need to add an ActionListener to the combo box. Read the section from the Swing tutorial on How to Use Combo Boxes.

So you need to spend time reading the Swing tutorial to learn some Swing basics before continuing on with your project.

camickr
  • 321,443
  • 19
  • 166
  • 288