2015-06-20 179 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所示。