[英]How to paint/repaint/animate (MVC)
我试图编写一个使用MVC模式为对象(鱼,气泡,鲨鱼等)设置动画的程序。
该模型具有一个带有具有x和y值的对象的LinkedList。 视图具有用于启动和停止动画的按钮。 我在视图中的JFrame中添加了按钮和Jpanel。 但是我不确定如何绘制/设置我的对象的动画。 视图如下所示:
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);
}
}
我的计划是在Controller中创建一个Thread,以更新Model中的对象并重新绘制它们。 像这样:
Model.updateOjects;
View.PaintingSheet.repaint();
Thread.sleep(x);
1)是否可以在视图外部的线程中调用重绘?
2)有更好的方法吗?
3)我如何用模型中更新的LinkedList调用重绘?
4)我怎样才能将背景从重新粉刷的蜜蜂中清除(它不会移动)?
谢谢
Thread.sleep(x);
阻止EDT,并且不允许重涂。
请改用javax.swing.Timer。 移动代码
Model.updateOjects;
View.PaintingSheet.repaint();
在Timer的操作中(在actionPerformed()方法内部调用)。
是否可以在
View
之外的Thread
调用重绘?
琐碎,是的; 实际上,不,正如这里所讨论的:“您仍然需要同步对线程之间共享的任何数据的访问。” 如果您的Model
在一个固定的时间,该时间比舒适的可接受的帧周期较少迭代,使用javax.swing.Timer
,如图所示在这里 。 如果没有,迭代Model
在doInBackground()
上SwingWorker
,如图所示这里 。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.