我有一个名为DataPanel的面板,它扩展了JPanel,还有一个名为DataPanelWorker的worker,它扩展了SwingWorker。
目前,当我创建DataPanel时,我会启动DataPanelWorker,它会执行一些计算,并在每次计算后触发属性更改。
DataPanel侦听这些属性更改,并每次显示一条消息。例如:“计算%1完成”“计算%2完成”
这可以很好地工作!
我现在想要做的是创建DataPanel的第二个实例(让我们称它为DataPanel2),但我想使用原始的DataPanelWorker来节省计算。我在DataPanelWorker上将DataPanel2注册为另一个propertyChangeListener。
我的问题是,我可能会在计算1完成并触发第一个propertyChangeEvent之后注册DataPanel2。我如何才能知道worker走了多远,才能让DataPanel2显示与DataPanel1相同的消息?
理想情况下,我希望保留一个propertyChangeEvents队列,当注册一个新组件时,只在该组件上触发它们。有没有标准的方法来做这件事?或者我从错误的角度来看待它?
谢谢
发布于 2017-10-07 02:58:53
从概念上讲,您的SwingWorker应该publish() Calculation的临时实例,以便process()可以更新您的DataModel并通知任何侦听器。
class DataPanelWorker extends SwingWorker<List<Calculation>, Calculation> {…}
class DataModel {
private List<Calculation> list = new ArrayList<>();
…
}然后,您的process()实现可以在事件分派线程上更新您的DataModel。通过这种方式,您的DataModel始终具有计算的完整状态。任何侦听DataPanel都可以向DataModel请求要显示的当前List<Calculation>。您的DataModel可以使用here所示的任何方法通知侦听器新数据的到达。此example更新JLabel;此example还更新图表;此example更新侦听JTable的TableModel。
DataPanelWorker…执行一些计算,并在每次计算后触发属性更改。
避免在doInBackground()实现中触发属性更改事件,因为对任何共享数据的访问都需要独立于工作线程进行同步。相反,在您的process()实现中更新您的DataModel,这将为您同步访问。然后,DataModel可以为已注册的侦听器激发事件,因为它知道更新将在事件分派线程上发生。
有没有暂停
doInBackground()线程的方法?
这是允许的,但您不应该在此上下文中这样做。如有必要,多个工作进程可以按照here所示进行协作。
https://stackoverflow.com/questions/46610100
复制相似问题