自定义Swing组件更新延迟

时间:2016-05-15 18:44:41

标签: java multithreading swing concurrency java-7

可以在此处下载DEMO文件github

我正在尝试在Java Swing中实现Conways Game Of Life。一切都有效,除了自动踩踏。我的界面一直落后于模型。

enter image description here

我的应用程序的基本模型如下:

查看:

view.GOLView:一个可运行的类,它构造接口,然后添加给定网格大小的view.GridPanel

view.GridPanel扩展JPanel并初始化view.GridCellComponents中包含的GridLayout数组。每个view.GridCellComponent都是JComponent的子类,它会覆盖paintComponent()方法。它还包含一个方法,它接受两个索引和一个更新相应GridCellComponent的值,然后更新其内部状态并调用this.paintImmediately(..)

型号:

model.GOLField将当前字段保存为boolean[][]数组,并包含synchronized方法来计算下一步。 nextStep方法返回带有更改索引的ArrayList

控制器:

controller.GOLController包含main方法的类。它会初始化view.GOLView班级和model.GOLField班级以及来电SwingUtilities.invokeLater(view)

问题:

当计算下一步时,我在nextStep上调用GOLField并迭代其返回的每个更改,并在updateCell上调用GOLView函数。将更新传递到相应的GridCellComponent,然后调用this.paintImmediately()。 这在调用一次时工作正常,但是当我尝试自动化时,内部状态(在GOLField中)得到更新,但界面滞后。

到目前为止我尝试了什么:

  • 使用执行nextStep的线程,更新界面,然后Thread.sleep()更新250毫秒。
  • 使用同样的SwingTimer
  • 使用SwingWorker调用nextStep中的doInBackground并更新done中的界面。
  • 使用与SwingTimer相同的常规定时器,但调用SwingUtilities.invokeLater来更新界面。

这些方法中的每一个都表现出同样的问题。 nextStep被称为正常,模型在后台更新,但界面在两者之间停止并跳过多次迭代。所以nextStep必须阻止EVT线程,但是当我检查哪个线程nextStep运行时,它总是告诉我它没有在EVTThread上运行(除了明显使用SwingTimer时)

任何想法?

编辑://我添加了可以运行的演示文件,编译并运行Main.java文件。如果你在* unix上,你也可以简单地运行'run'bash脚本。

0 个答案:

没有答案