JavaSwingGUI冻结-观察者模式

JavaSwingGUI冻结-观察者模式,java,swing,jtextfield,observer-pattern,Java,Swing,Jtextfield,Observer Pattern,对于我正在创建的一个程序,我使用了Observable模式,然而,尽管我的Observable几乎不断地发送数据,这里用循环模拟,因为实际代码连接到设备并测量数据,我的update();方法按其应该的方式运行,但swing没有 Swing只在循环完成后更新JTextField,但是当我使用System.out.println()时,它会很好地迭代每次更新 可观察代码: public void collectData() { for(int i = 0; i < 10; i++)

对于我正在创建的一个程序,我使用了Observable模式,然而,尽管我的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来实现)

与其显式地遍历您的观察者,不如让
observative
来实现,如图所示


此外,请确认您没有阻止。如果是这样,考虑使用,这大大简化了摆动线程。< /p>我假设通知调用UpDebug()方法。由于update()方法更改了textfield的内容,请确保在EDT(事件调度线程)中调用它。它在EDT中运行,没有成功=(谢谢,我使用了SwingWorker,一旦我知道如何使用我的模式混乱,它就工作得很好!
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
}
this.setChanged();
this.notifyObservers();