这是我的代码的一部分,它执行某种动画;然而,似乎出现了一些问题:每当我尝试使用匿名类中传递的'g'来绘制任何内容时,它什么都不做,但是当我在匿名类之外使用它时(在rollBalls方法内)它会做什么它应该这样做。知道为什么吗?我该如何解决这个问题?谢谢。
protected void paintComponent(Graphics g) {
super.paintComponent(g);
rollBalls(g);
}
private void rollBalls(final Graphics g) { //Roll all 3 balls on the bar
new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
g.setColor(Color.red);
g.fillRect(0, 0, 500, 500);
}
}).start();
}
答案 0 :(得分:3)
我同意Hovercraft Full Of Eels的评论。你应该做这样的事情
class MyClass extends JComponent{
MyClass(){
new Timer(1, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
MyClass.this.repaint();
}
}).start();
}
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(0, 0, 500, 500);
}
答案 1 :(得分:3)
您的问题有几个问题,但首先您了解传递给paint或paintComponent方法的Graphics对象通常不会持久存在,并且可能在方法完成后被处理掉。接下来,您将从paintComponent方法中调用程序逻辑,该方法永远不应该完成。您无法完全控制何时或甚至调用paint或paintComponent方法,因此不应该指示应用程序的逻辑。
因此,您不会以这种方式进行Swing图形处理。相反,让你的计时器在任何paintComponent方法之外,让它更新类字段,让它调用repaint()并让你的paintComponent使用这些类字段根据需要进行绘图,这次使用稳定的Graphics对象通过参数传递给它。
我知道你的代码“只是一个样本”,但是你通过尝试直接从actionPerformed中绘制来做错事。你根本就不应该这样做。
答案 2 :(得分:0)
也许生活在错误的线程上进行GUI更新?尝试将匿名类中的绘图命令放入Runnable并将其传递给SwingUtilities.invokeLater。
我认为它与内在阶级无关。