Faizi
Faizi

Reputation: 450

How to draw graphs using Java Swing

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.

Upvotes: 0

Views: 12160

Answers (1)

camickr
camickr

Reputation: 324197

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.

Upvotes: 1

Related Questions