【问题标题】:Java API returning progress to clientJava API 向客户端返回进度
【发布时间】:2013-10-26 19:23:25
【问题描述】:

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

【问题讨论】:

  • “我想要一种能够定期向客户端提供操作反馈(完成百分比)的方法” API 实际上是否提供了任何查询完成的方法?如果是这样,应该很容易在SwingWorker 中使用它来更新进度条。如果没有,你能做的最好的就是一个不确定的进度条。无论哪种方式,它都会返回JProgressBar。那为什么不适合呢?
  • @AndrewThompson:我的猜测——它不适合在被观察的类中,这确实是有道理的,因为观察者可能会显示数据。听起来他只需要一个好的观察者设计模式。
  • @rockstar 持有 EDT 规则,因为 regular feedback ( % completion... 仅与您的代码有关

标签: java swing jar progress


【解决方案1】:

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

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

【讨论】:

  • @rockstar SwingWorker 就是这个概念的一个很好的例子
【解决方案2】:

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

一种方法是向客户端返回BoundedRangeModel

 public BoundedRangeModel getProgressModel();

然后客户端可以获取它并且

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

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

【讨论】:

  • 是的,这对于绑定数字属性可能会更好。 1+
猜你喜欢
  • 1970-01-01
  • 2017-01-04
  • 2018-01-24
  • 2023-04-08
  • 1970-01-01
  • 2015-02-02
  • 2021-04-13
  • 1970-01-01
  • 2020-02-16
相关资源
最近更新 更多