繁体   English   中英

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

[英]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 ,如图所示在这里 如果没有,迭代ModeldoInBackground()SwingWorker ,如图所示这里

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM