2013-10-26 67 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