【发布时间】: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...仅与您的代码有关