如何绘制/重绘/动画(MVC)

时间:2015-06-20 18:16:51

标签: java swing animation paintcomponent thread-sleep

Iam尝试使用MVC模式编写一个动画对象(鱼,泡泡,鲨鱼等)的程序。

Model具有带有x和y值的对象的LinkedList。 视图具有开始和停止动画的按钮。 我将按钮和Jpanel添加到View中的JFrame。 但我不确定如何绘制/动画我的对象。视图如下所示:

'\n\x8bk\xd8\xd9\xb0\x8b\x08\xd6N2\xd1\x81ww\xfb'

我的计划是在Controller中创建一个Thread来更新Model中的Objects并重新绘制它们。 像这样:

  public class View extends JFrame {
.
.
.
   this.add(paintingSheet, BorderLayout.CENTER);
.
.
.
}


    public class PaintingSheet extends JPanel {
    private Image background;
    public PaintingSheet() {
        this.background = Toolkit.getDefaultToolkit().createImage("src/resources/background.jpg");
    }
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.drawImage(this.background, 0,0, this);
    }
}

1)是否允许在视图外的线程中调用重绘?

2)有更好的方法吗?

3)如何使用模型中更新的LinkedList调用重绘?

4)我怎样才能将背景排除在重绘之外(它不会移动)?

谢谢

2 个答案:

答案 0 :(得分:3)

Thread.sleep(x);

阻止EDT并且不允许重新绘制。

请改用javax.swing.Timer。移动代码

Model.updateOjects;
View.PaintingSheet.repaint();

在Timer的动作中(在actionPerformed()方法中调用)。

答案 1 :(得分:2)

  

是否允许在Thread之外的View内调用重绘?

平凡,是的;实际上,不,正如所讨论的here:“你仍然需要同步访问线程之间共享的任何数据。”如果您的Model在比您可接受的帧周期短的固定时间内进行迭代,请使用javax.swing.Timer,如图here所示。如果没有,请迭代SwingWorkerModel中的doInBackground(),如图所示here