我正在编写一个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。
答案 0 :(得分:4)
我会给它一个PropertyChangeSupport对象以及addPropertyChangeListener(...)
和removePropertyChangeListener(...)
方法。在内部,我使用激活支持对象的setter创建绑定属性。这样,可以以标准方式通知外部库,使得感兴趣的属性发生变化。如果它是基于Swing的库,请考虑使用SwingPropertyChangeSupport对象,以便在Swing事件线程上通知已添加到支持对象的所有PropertyChangeListener。
例如,请查看这些问题的答案:
答案 1 :(得分:4)
因为您想要为客户提供进展,您可以使用特定的模型。
一种方法是将BoundedRangeModel返回给客户。
public BoundedRangeModel getProgressModel();
然后客户可以获得它并
JProgressBar
或JSlider
或其他任何内容。我希望BoundedRangeModel
优于PropertyChangeListener
,因为BoundedRangeModel
提供了getValueAdjusting()方法。客户可以询问是否正在调整值以防止不必要的重新绘制。