我似乎并不完全理解paintcomponent方法,包括使用重绘。 好几次,我不明白为什么重绘不使用某些代码,而在另一个代码中工作正常。 我试图创建一个Graph绘画类。现在它的y = x。但它不会起作用。 paintcomponent似乎只被调用一次。那是为什么?
public class Graph extends JPanel
{
private int oldX=0,oldY=0,newX=1,newY=1;
public Graph()
{
invokeInitWindow();
}
public void invokeInitWindow()
{
SwingUtilities.invokeLater(new Runnable()
{
public void run()
{
init();
}
});
}
public void init()
{
JFrame frame = new JFrame();
frame.setPreferredSize(new Dimension(300,300));
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(this);
frame.pack();
frame.setVisible(true);
}
public void move()
{
newY=++newX;
oldX=oldY=newX+1;
}
public void runGraph()
{
while(newX < 500)
{
move();
repaint();
}
}
public static void main(String[] args)
{
Graph g = new Graph();
g.runGraph();
}
public void paintComponent(Graphics g)
{
g.setColor(Color.BLACK);
g.drawLine(oldX, oldY, newX, newY);
}
}
答案 0 :(得分:0)
因此,在添加了一些关于该地点的System.out.println
命令之后,显然您基本上处于竞争状态。
也就是说,你的while-loop
能够如此快地运行,它实际上是在屏幕上可见窗口之前完成的,所以它在屏幕的某处画了一个点。
你需要做的是,在循环中注入一个小延迟以减慢它(所以一个人可以真正看到它),类似......
public void runGraph() {
while (newX < 500) {
try {
Thread.sleep(40);
} catch (InterruptedException ex) {
Logger.getLogger(Graph.class.getName()).log(Level.SEVERE, null, ex);
}
move();
repaint();
}
}
JFrame
并在将来的某个时间执行此操作。这是你真正想避免做的事情。构造函数应该初始化对象的状态,这就是全部。
目前你设置它的方式,你不可能以任何有意义的方式重新使用面板。
其次,在进行任何自定义绘画之前,你真的应该调用super.paintComponent
。绘画是Swing由一系列链接在一起的方法调用组成,每个方法都做一个小而重要的工作,除非你确切知道该方法正在做什么,你将接管它的工作,它只是简单地称之为{ {1}}方法。
我猜你正试图绘制一条增长的线,所以我修改了super
方法,所以线的起点保持不变。我可能是你打算让它在屏幕上移动,在这种情况下,恢复代码并不困难,我只是不确定
move