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)我怎样才能将背景排除在重绘之外(它不会移动)?
谢谢
答案 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所示。如果没有,请迭代SwingWorker
的Model
中的doInBackground()
,如图所示here。