在摆动的画布上绘制和重绘

时间:2017-12-26 11:23:35

标签: java swing canvas

我知道在摇摆中没有直接替换java.awt.Canvas,我知道I'm supposed to use a JPanel并覆盖paintComponent,例如:

public void paintComponent(Graphics g) {
    g.setColor(Color.black);
    g.drawOval(0, 0, 100, 100);
}

这会在创建时在JPanel上绘制一个黑色圆圈。我遇到的问题是我需要一个动态画布:我希望能够根据用户输入绘制内容,并连续重绘,而不是只在应用程序启动时重绘一次。一个例子是在画布上有一个移动物体,需要以每秒60帧的速度重新绘制。如何在不使用AWT组件的情况下实现这一目标?

编辑:我的意思是,在一个实际的画布中,我可以在我的代码中随意调用drawOval,这样会在画布上绘制一个椭圆形;这对JPanel来说是否可行?

2 个答案:

答案 0 :(得分:3)

存储要绘制的信息(例如Shape或其中一组)并从Swing repaint()中调用Timer。每次调用paintComponent(..)方法时,首先调用super(..)方法擦除以前的图形,然后迭代形状列表,必要时移动它们,然后绘制每个图形。

答案 1 :(得分:2)

以下是一种方法:

public class Renderer extends JComponent implements ActionListener {
    private int x;        

    public Renderer() {
        Timer timer = new Timer(1000/60, this);
        timer.start();
        x = 0;
    }

    @Override
    public void paintComponent(Graphics g) {
        super.paint(g);
        // drawing code
        g.setColor(Color.black);
        g.drawOval(x, 0, 100, 100);
    }

    private void update() {
        this.x++;    
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        update();
        repaint();      
    }

}

现在只需将其添加到您的组件(JPanel或其他):

comp.add(new Renderer());