我正在试图弄清楚重绘方法是否做了我们自己无法做到的事情。
我的意思是,这两个版本有何不同?
public class Component extends JComponent {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle r = new Rectangle(0,0,20,10);
g2.draw(r);
r.translate(5,5);
g2.draw(r);
}
}
和
public class Component extends JComponent {
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
Rectangle r = new Rectangle(0,0,20,10);
g2.draw(r);
r.translate(5,5);
repaint();
}
}
答案 0 :(得分:2)
第二个版本可能导致非常冒险和糟糕的动画,因为它可能导致重复调用重复,并且是永远不应该完成的事情。如果您需要在Swing GUI中使用简单动画,请使用Swing Timer来驱动动画。
即,
public class MyComponent extends JComponent {
private Rectangle r = new Rectangle(0,0,20,10);
public MyComponent() {
int timerDelay = 100;
new Timer(timerDelay, new ActionListener(){
public void actionPerformed(ActionEvent e) {
r.translate(5, 5);
repaint();
}
}).start();
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
g2.draw(r);
}
}
使用repaint()
是建议到JVM需要绘制组件,但是它永远不应该在paint或paintComponent方法中以半递归的方式调用。上面可以看到它的使用示例。请注意,除非在非常特殊的情况下,否则您不希望直接调用绘制方法 - paint或paintComponent。
同时避免调用类Componenet
,因为该名称与核心Java类冲突。