【问题标题】:How to paint/repaint/animate (MVC)如何绘画/重绘/动画(MVC)
【发布时间】:2015-09-06 13:42:34
【问题描述】:

我正在尝试编写一个使用 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);
    }
}

我的计划是在控制器中创建一个线程来更新模型中的对象并重新绘制它们。 像这样的:

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

1) 是否允许在视图外的线程中调用重绘?

2) 有更好的方法吗?

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

4) 我怎样才能从重新绘制的蜜蜂中排除背景(它不移动)?

谢谢

【问题讨论】:

  • 我建议在调用您的绘制方法时计算对象的当前位置。这将使您的动画更流畅,而不是重复更新模型。 (只有在计算能够真正快速完成的情况下才有可能)

标签: java swing animation paintcomponent thread-sleep


【解决方案1】:

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

简单地说,是的;实际上,不,正如here 所讨论的那样:“您仍然需要同步对线程之间共享的任何数据的访问。”如果您的Model 在一个比您可接受的帧周期短得多的固定时间内迭代,请使用javax.swing.Timer,如here 所示。如果没有,则在SwingWorkerdoInBackground() 中迭代Model,如图here

【讨论】:

    【解决方案2】:
    Thread.sleep(x);
    

    阻止 EDT 并且不允许重绘。

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

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

    在 Timer 的操作中(在 actionPerformed() 方法中调用)。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2019-04-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-10-08
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多