[英]Java swing concurrency, multiple propertychangelisteners?
我有一个名为DataPanel的面板,它扩展了JPanel,还有一个名为DataPanelWorker的工人,它扩展了SwingWorker。
当前,当我创建DataPanel时,我会启动DataPanelWorker,它执行一些计算并在每次计算后触发属性更改。
DataPanel侦听这些属性更改,并每次显示一条消息。 例如,“计算1完成”“计算2完成”
这样很好!
现在,我想做的是创建DataPanel的第二个实例(我们称之为DataPanel2),但是我想使用原始的DataPanelWorker来保存计算。 我将DataPanel2注册为DataPanelWorker上的另一个propertyChangeListener。
我的问题是,在计算1完成并且第一个propertyChangeEvent被触发之后,我可能会注册DataPanel2。 我如何知道工作人员的距离,以便使DataPanel2显示与DataPanel1相同的消息?
我理想的情况是保留一个propertyChangeEvents队列,并在注册新组件时将它们全部触发该组件。 有这样做的标准方法吗? 还是我从错误的角度看待它?
谢谢
从概念上讲,您的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
可以使用此处显示的任何方法,将新数据的到达通知给侦听器。 这个例子更新了一个JLabel
; 此示例还更新了图表; 本示例更新了侦听JTable
的TableModel
。
DataPanelWorker
…进行一些计算,并在每次计算后触发属性更改。
避免在doInBackground()
实现中触发属性更改事件,因为对任何共享数据的访问都需要独立于worker进行同步。 而是在process()
实现中更新DataModel
,它为您同步访问。 然后, DataModel
可以知道已在事件调度线程上发生更新,从而为注册的侦听器触发事件。
有没有办法暂停
doInBackground()
线程?
这是允许的,但是在这种情况下您不必这样做。 如有必要,多个工人可以按此处所示进行合作。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.