3

我正在编写一个java library ( jar )包含许多将由外部软件调用的 API。其中一个 API 将是一个阻塞 API,并且将执行一个可能相当冗长的操作。

我想要一种能够定期向客户提供操作反馈(完成百分比)的方法。

NOTE由于它是一个库,我不能使用进度条的 Java Swing 机制来获取和更新进度百分比。我搜索的一切都以某种方式导致了这一点。

有没有办法做到这一点?

Answer Update

非常感谢所有发布答案的人。它帮助我掌握了。我在我的 jar 上暴露了以下接口。客户端工作线程将注册并监听我的进度更新。然后它会相应地更新进度条。

void LongAPI(){
while{
do work ; 
fireprogress();
     }
}
public void addProgressListener(Listener listener) {
    listeners.add(listener);

}

public void removeProgressListener(Listener listener) {
    listeners.add(listener);
}

private void fireProgress(double pourcent) {
    for (Listener listener : listeners) {
        listener.setProgress(pourcent);
    }
}

Listener是一个所有客户端都实现的抽象接口。它具有 setProgress 属性,客户端可以根据需要使用该属性更新其 UI。

4

2 回答 2

4

我会给它一个 PropertyChangeSupport 对象以及addPropertyChangeListener(...)方法removePropertyChangeListener(...)。在内部,我会使用触发支持对象的设置器创建绑定属性。通过这种方式,可以以标准方式通知外部库感兴趣的属性已更改。如果它是基于 Swing 的库,请考虑专门使用 SwingPropertyChangeSupport 对象,以便在 Swing 事件线程上通知已添加到支持对象的所有 PropertyChangeListener。

例如,请查看以下问题的答案:

于 2013-10-18T04:05:23.887 回答
4

因为您想为客户提供进步,所以您可以为此使用特定的模型。

一种方法可能是将BoundedRangeModel返回给客户端。

 public BoundedRangeModel getProgressModel();

然后客户可以得到它并且

  • 将其直接连接到 ui 组件,例如JProgressBarJSlider或其他。
  • 或将其连接到他自己的模型对象并监听变化
  • 或者只是在客户端需要时检索状态。

我更喜欢BoundedRangeModela PropertyChangeListener,因为 aBoundedRangeModel提供了一个getValueAdjusting()方法。客户可以询问该值是否正在调整以防止不必要的重绘。

于 2013-10-18T04:20:19.840 回答