我正试图弄清楚重新绘制方法是否做了我们自己无法做的事情。
我的意思是,这两个版本有何不同?
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();
}
}
第二个版本可能会导致非常危险和糟糕的动画,因为它可能会导致重复调用重新绘制,而这是永远不应该做的事情。如果您需要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类冲突。