繁体   English   中英

Java swing并发,多个propertychangelisteners?

[英]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 ; 示例还更新了图表; 示例更新了侦听JTableTableModel

DataPanelWorker …进行一些计算,并在每次计算后触发属性更改。

避免在doInBackground()实现中触发属性更改事件,因为对任何共享数据的访问都需要独立于worker进行同步。 而是在process()实现中更新DataModel ,它为您同步访问。 然后, DataModel可以知道已在事件调度线程上发生更新,从而为注册的侦听器触发事件​​。

有没有办法暂停doInBackground()线程?

这是允许的,但是在这种情况下您不必这样做。 如有必要,多个工人可以按此处所示进行合作。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM