2013-10-18 437 views
3

我正在編寫一個java library (jar),其中包含許多將由外部軟件調用的API。其中一個API將是一個阻塞API,並將執行可能相當長的操作。Java 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

*「我希望有一個方法能夠提供操作客戶的定期反饋(%完成)」 * API是否實際提供任何手段來查詢完成?如果是的話,它應該是容易使用,從'SwingWorker'內更新進度條。如果不是,你能做的最好的是一個不確定的進度條。無論哪種方式,它返回到'JProgressBar'。那爲什麼它不適合? –

+0

@AndrewThompson:我的猜測 - 它並不適用於觀察到的類,它有一定道理,因爲觀察者可能會被顯示的數據。它聞起來像他所需要的是一個很好的觀察者設計模式。 –

+0

@rockstar持有EDT rulles,因爲'正反饋(%完成...'大概只有你的代碼 – mKorbel

回答

4

我會給它一個PropertyChangeSupport對象以及addPropertyChangeListener(...)removePropertyChangeListener(...)方法。在內部,我會創建綁定屬性與啓動支持對象的設置器。這樣,外部圖書館可以以標準方式通知感興趣的財產已經改變。如果它是基於Swing的庫,請考慮特別使用SwingPropertyChangeSupport對象,以便在Swing事件線程上通知已添加到支持對象的所有PropertyChangeListener。

例如,請看看在這些問題的答案:

+2

@rockstar的'SwingWorker'是這個概念的一個很好的例子 – MadProgrammer

4

因爲你想給前進到客戶端,您可以使用一個特定的模型爲了那個原因。

一種方法可能是將BoundedRangeModel返回給客戶端。

public BoundedRangeModel getProgressModel(); 

客戶端然後可以得到它,

  • 其直接連接到一個UI組件,例如JProgressBarJSlider或其他。
  • 或將其連接到他自己的模型對象,並聽取更改
  • 或只是檢索客戶端需要它時的狀態。

我寧願BoundedRangeModelPropertyChangeListener,因爲BoundedRangeModel提供getValueAdjusting()方法。客戶可以詢問值是否調整以防止不必要的重繪。

+0

是的,這很可能是結合數字性能更好。1+ –