2009-02-11 36 views
0

我有一個Java GUI,它具有許多文本字段,其值從另一個類中的靜態變量填充。不斷更新GUI元素的最佳方式

我想知道最好的辦法是什麼讓這個當變量在另一個類改變時,更新會立即反映在GUI。

如果任何人可以提出一個建議的一種有效的方式做到這一點的將高度讚賞。

非常感謝您的答覆提前

編輯:

其他細節

  • 使用搖擺
  • 更新將理想的實時

回答

3

在我看來是明智的選擇,是落實它繼Observer Pattern。你可以找到很多例子,關於這一主題像this

1

你沒有提及您使用的工具包以及您的p的體系結構項目是。

它也並不清楚自己想要如何快速和頻繁更新的GUI元素,如flickrers成本可能太大,因此可能會在使用收聽機構通知的成本。

如果確定更改是相當直接的,並且如果我不需要實時性能,而只是向用戶提供一些反饋,我一直很高興運行後臺線程,偶爾會進行檢查和更新如有必要。

+0

更新了更多的細節。對不清楚的道歉。 – 2009-02-11 22:26:41

0

最簡單的方法是首先控制對該靜態變量的所有訪問。將其設爲私有,並且只能通過某種單一方法修改。其次,請在所有這些文本字段上調用setText(),並將它們設置爲新值。

如果該變量的值可以在事件指派線程之外被改變,那麼這個方法必須使用SwingUtilities.invokeLater()設置這些文本字段;組件只能由EDT訪問。

如果每個文本字段的顯示都是通過多個分散方法計算的,那麼您的變量設置方法只需調用這些方法(可能如上所述包含在invokeLater()中)。

如果可變修改代碼不提前知道哪些文本字段將受到影響,這時你需要允許控制每個文本字段對象將自己添加到修改代碼的聽衆。 (這是MVC設計,通常被認爲是好的。)然後,修改代碼調用列表中的每個偵聽器,並讓它知道值已更改。

0

觀察者/可觀察使用監聽器。這裏有一個實例變量:

public class StaticVarClass { 
    public static interface Listener { 
     public void varChanged(Object oldVar, Object newVar); 
    } 

    private Object var; 

    private List<Listener> listeners = new CopyOnWriteArrayList<Listener>(); 

    public void addListener(Listener l) { listeners.add(l); } 
    public void removeListener(Listener l) { listeners.remove(l); } 

    protected void fireVarChanged(Object oldVar, Object newVar) { 
     for (listener : listeners) listener.varChanged(oldVar, newVar); 
    } 

    public void setVar(Object newVar) { 
     fireVarChanged(var, var = newVar); 
    } 

當然,你可以使用內置的PropertyChangeListener機制也。