我正在学习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中的选择时,未检测到更改。请帮助我我在这里想念的东西。
答案 0 :(得分:1)
运行此代码时,不会绘制任何图形。
您不应在JFrame上覆盖paint(...)。通过覆盖JPanel的paintComponent(...)来完成自定义绘制,然后将面板添加到框架中。阅读有关Custom Painting的Swing教程中的部分,以获取更多信息和工作示例,以帮助您入门。
一种绘画方法仅用于绘画。您不应该调用repaint()。 Swing将确定组件何时需要重绘自身或您在外部方法中调用repaint()。绘画代码仅应绘画组件的当前状态。如果您具有更改的属性,则需要更改这些属性然后重新绘制()组件的方法。
您不应在绘画方法中调用Thread.sleep()。
您正在创建不执行任何操作的线程。如果要在线程启动时执行代码,则需要将可运行对象传递给线程。但是,在这种情况下,如果要动画化图形,则应为动画使用Swing Timer。当Timer触发时,您将更新类的属性,然后调用repaint()。
此外,当我更改JComboBox中的选择时,未检测到更改。
您需要将ActionListener添加到组合框中。阅读How to Use Combo Boxes上Swing教程中的部分。
因此,在继续进行项目之前,您需要花时间阅读Swing tutorial
来学习一些Swing基础知识。