再次使用Draw和Repaint

时间:2015-04-06 19:34:37

标签: java swing graphics

我正在试图弄清楚重绘方法是否做了我们自己无法做到的事情。

我的意思是,这两个版本有何不同?

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();
    }
}

1 个答案:

答案 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类冲突。