2015-06-20 191 views
0

Iam试图编写一个使用MVC模式动画对象(鱼,泡沫,鲨鱼等)的程序。如何绘制/重绘/动画(MVC)

该模型有一个链接列表与x和y值的对象。 视图有按钮来启动和停止动画。 我在视图的JFrame中添加了按钮和一个Jpanel。 012am但我不知道如何绘制/动画我的对象。该视图看起来是这样的:

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

我的计划是让一个线程在控制器更新模型中的对象和重新油漆一下。 事情是这样的:

Model.updateOjects; 
View.PaintingSheet.repaint(); 
Thread.sleep(x); 

1)它允许调用线程重绘视图之外?

2)有没有更好的方法来做到这一点?

3)我如何使用模型中更新的LinkedList调用repaint?

4)我如何排除bein重新绘制的背景(它不移动)?

谢谢

+0

无论何时调用paint方法,我都会建议对对象的当前位置进行计算。这将使您的动画更平滑,而不是重复更新模型。 (只有在计算可以真正快速完成的情况下才有可能) – slartidan

回答

3
Thread.sleep(x); 

块EDT,不允许重新粉刷。

改为使用javax.swing.Timer。移动代码

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

在计时器的动作(在actionPerformed()方法内调用)。

2

是否允许在View以外的Thread调用repaint?

平凡,是的;实际上,不,如讨论here:“您仍然需要同步访问线程之间共享的任何数据。”如果您的Model在一个固定的时间内迭代,该时间比您的可接受的帧周期小得多,请使用javax.swing.Timer,如here所示。如果不是,则重复SwingWorkerModeldoInBackground(),如here所示。