Java API将进度返回给客户端

时间:2013-10-18 04:02:35

标签: java swing jar progress

我正在编写一个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。

2 个答案:

答案 0 :(得分:4)

我会给它一个PropertyChangeSupport对象以及addPropertyChangeListener(...)removePropertyChangeListener(...)方法。在内部,我使用激活支持对象的setter创建绑定属性。这样,可以以标准方式通知外部库,使得感兴趣的属性发生变化。如果它是基于Swing的库,请考虑使用SwingPropertyChangeSupport对象,以便在Swing事件线程上通知已添加到支持对象的所有PropertyChangeListener。

例如,请查看这些问题的答案:

答案 1 :(得分:4)

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

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

 public BoundedRangeModel getProgressModel();

然后客户可以获得它并

  • 将其直接连接到ui组件,例如JProgressBarJSlider或其他任何内容。
  • 或将其连接到自己的模型对象并收听更改
  • 或只是在客户需要时检索状态。

我希望BoundedRangeModel优于PropertyChangeListener,因为BoundedRangeModel提供了getValueAdjusting()方法。客户可以询问是否正在调整值以防止不必要的重新绘制。