Java API将进度返回给客户端

Java API将进度返回给客户端,java,swing,jar,progress,Java,Swing,Jar,Progress,我正在编写一个javalibrary(jar),其中包含许多将由外部软件调用的API。其中一个API将是阻塞API,并将执行可能相当长的操作 我想要一种能够定期向客户提供操作反馈(%completion)的方法 注意由于它是一个库,我不能使用进度条的Java Swing机制来获取和更新进度百分比。我所寻找的一切都会导致这样的结果 有什么办法可以这样做吗 Answer Update 非常感谢所有发布答案的人。它帮助我理解了。我在我的jar上公开了以下接口。客户端工作线程将注册并侦听我的进度更新。

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

我想要一种能够定期向客户提供操作反馈(%completion)的方法

注意
由于它是一个库,我不能使用进度条的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

我会给它一个PropertyChangeSupport对象以及
addPropertyChangeListener(…)
removePropertyChangeListener(…)
方法。在内部,我将使用启动支持对象的setter创建绑定属性。通过这种方式,可以以标准方式通知外部库感兴趣的属性已更改。如果它是一个基于Swing的库,考虑使用特定的Swing属性转换对象,以便在Swing事件线程上通知已经添加到支持对象的所有PrimeTyeLististor。< /P> 例如,请查看以下问题的答案:


因为你想给客户带来进步,所以你可以使用特定的模型

一种方法是向客户机返回一个

 public BoundedRangeModel getProgressModel();
然后,客户可以获得它并

  • 将其直接连接到ui组件,例如
    JProgressBar
    JSlider
    或其他任何组件
  • 或者将其连接到他自己的模型对象并聆听更改
  • 或者在客户端需要时检索状态

我更喜欢
BoundedRangeModel
而不是
PropertyChangeListener
,因为
BoundedRangeModel
提供了一种方法。客户可以询问该值是否正在调整以防止不必要的重新绘制。

@rockstar
SwingWorker
就是这个概念的一个很好的例子,“我希望有一种方法能够定期向客户提供操作的反馈(%completion)”。API是否确实提供了任何查询完成情况的方法?如果是这样,那么在
SwingWorker
中使用它来更新进度条应该很容易。如果没有,最好的方法就是使用一个不确定的进度条。无论哪种方式,它都会返回到
JProgressBar
。那么为什么它不合适呢?@AndrewThompson:我猜——它不适合被观察的类,这是有意义的,因为观察者可能会显示数据。闻起来他只需要一个好的观察者设计模式。@rockstar持有EDT rulles,因为
定期反馈(%completion…
仅与您的代码有关是的,这可能更适合绑定数字属性。1+