再次使用绘制与重新绘制



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

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

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

相关内容

  • 没有找到相关文章

最新更新