可以在此处下载DEMO文件:github
我正在尝试在Java Swing中实现Conways Game Of Life。一切都有效,除了自动踩踏。我的界面一直落后于模型。
我的应用程序的基本模型如下:
查看:
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脚本。