2013-10-26 134 views
2

對於我創建的程序,我使用了觀察者模式,但雖然我的Observable幾乎不斷地發送數據,但是在這裏模擬了一個循環,因爲實際代碼連接到設備並測量數據,我的更新();方法運行它應該但擺動不。Java Swing GUI凍結 - 觀察者模式

Swing只會在循環完成後更新JTextField,但是當我使用System.out.println()時,它會很好地迭代每次更新。

可觀察代碼:

public void collectData() 
{ 

    for(int i = 0; i < 10; i++) 
    { 
     currRandom = (Math.random() * 10); 
     for(Observer o : observers) 
     { 
      notify(o); 
     } 

    } 
} 

觀察員(SWING)代碼:

public void update() 
{ 
    jRecievedData.setText(jRecievedData.getText() + "\n" + Double.toString(PVC.pc.getCurr())); 
    jlAverage.setText("Average: " + PVC.getAverage()); 
    jlMin.setText("Minimum: " + PVC.getMin()); 
    jlMax.setText("Maximum: "+ PVC.getMax()); 

    // setText updates slow 
} 

任何幫助將不勝感激! (我有感覺這是一個線程問題,但我不確定,如果是這樣,我仍然不知道如何做到這一點)

+0

我假設通知調用update()方法。由於update()方法更改文本字段的內容,因此請確保在EDT(Event Dispatch Thread)中調用它。 – avis

+0

它運行在美國東部時間,沒有成功=( –

回答

3

而不是顯式循環你的觀察者,讓Observable這樣做,如here所示。

this.setChanged(); 
this.notifyObservers(); 

此外,請確認您沒有阻止event dispatch thread。如果是這樣,請考慮使用SwingWorker,這大大簡化了Swing線程。

+1

謝謝,我已經使用SwingWorker,一旦我想出瞭如何讓我的模式混亂工作,它就像一個魅力! –

+0

不客氣,很高興你得到它排序。 – trashgod