Java Swing GUI冻结 - 观察者模式

时间:2013-10-26 06:59:53

标签: java swing jtextfield observer-pattern

对于我正在创建的程序,我使用了观察者模式,但是我的Observable几乎不断地发送数据,这里用循环模拟,因为实际代码连接到设备并测量数据,我的update();方法运行应该运行,但swing不运行。

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
}

任何帮助将不胜感激! (我觉得这将是一个线程问题,但我不确定,如果是,我仍然不知道如何用摇摆来做)

1 个答案:

答案 0 :(得分:3)

不要明确地循环观察者,而是Observable这样做,如图here所示。

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

另外,请确认您没有阻止event dispatch thread。如果是这样,请考虑使用SwingWorker,这极大地简化了Swing线程。