2

私が作成しているプログラムでは、オブザーバー パターンを使用しましたが、実際のコードはデバイスに接続され、データを測定するため、ここではループでシミュレートされています。メソッドは正常に実行されますが、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
}

どんな助けでも大歓迎です!(これはスレッド化の問題になると感じていますが、よくわかりません。そうであれば、swingでそれを行う方法はまだわかりません)

4

1 に答える 1

3

オブザーバーを明示的にループする代わりに、ここObservableに示すように実行します。

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

また、イベント ディスパッチ スレッドをブロックしていないことを確認します。その場合は、SwingWorkerSwing のスレッド化を大幅に簡素化する の使用を検討してください。

于 2013-10-26T07:44:09.163 に答える