如何使用Java Swing绘制图形

时间:2018-11-25 12:21:15

标签: java swing jframe

我正在学习Java Swing。我遵循了一个YouTube演讲播放列表,该播放列表提供了用于绘制图形的此github代码。我在这里提供基本结构:

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();
}

}

运行此代码时,不会绘制任何图形。另外,当我更改JComboBox中的选择时,未检测到更改。请帮助我我在这里想念的东西。

1 个答案:

答案 0 :(得分:1)

  

运行此代码时,不会绘制任何图形。

  1. 您不应在JFrame上覆盖paint(...)。通过覆盖JPanel的paintComponent(...)来完成自定义绘制,然后将面板添加到框架中。阅读有关Custom Painting的Swing教程中的部分,以获取更多信息和工作示例,以帮助您入门。

  2. 一种绘画方法仅用于绘画。您不应该调用repaint()。 Swing将确定组件何时需要重绘自身或您在外部方法中调用repaint()。绘画代码仅应绘画组件的当前状态。如果您具有更改的属性,则需要更改这些属性然后重新绘制()组件的方法。

  3. 您不应在绘画方法中调用Thread.sleep()。

  4. 您正在创建不执行任何操作的线程。如果要在线程启动时执行代码,则需要将可运行对象传递给线程。但是,在这种情况下,如果要动画化图形,则应为动画使用Swing Timer。当Timer触发时,您将更新类的属性,然后调用repaint()。

  

此外,当我更改JComboBox中的选择时,未检测到更改。

您需要将ActionListener添加到组合框中。阅读How to Use Combo Boxes上Swing教程中的部分。

因此,在继续进行项目之前,您需要花时间阅读Swing tutorial来学习一些Swing基础知识。