0

私はJava GUIプログラムを作成し、そのGUIにjListを追加して、呼び出して項目を追加することにより、そのjListにプログラムの出力を印刷しました

listBox.addElement(""); // where listBox is an instance of jList

しかし問題は、追加時に項目が表示されていないことです。プログラムが終了しようとしているときに表示されます。

つまり、「開始」ボタンをクリックしてプログラムを開始すると、「listBox」への項目の追加を含むすべての処理が完了しますが、プログラムが「actionPerformed()」に戻ると項目が jList に表示されます。 「開始」ボタンのActionListenerの"メソッド。

リストにアイテムが追加されたときにすぐにアイテムを表示するためにできること。

上記のアプリケーションはマルチスレッドです。メイン スレッドは GUI を起動し、10 個のスレッドを開始して jList の「listModel」(DefaultListModel のインスタンス) をすべてのスレッドに渡し、各スレッドが「addElement("")」メソッドを呼び出してリストに項目を追加できるようにします。 「リストモデル」

実際には、listModel は DefaultListModel クラスのサブクラス (DefaultListModelSubClass) のインスタンスです。addElement() メソッドをオーバーライドして「同期」させ、一度に 1 つのスレッドだけが項目を追加できるようにしました。

4

3 に答える 3

3

Event Dispatching ThreadGUI の更新を処理するスレッドである で処理を行おうとしている可能性があります。処理が GUI の更新をロックしており、処理が終了すると、適切な GUI の変更が反映されます。これを機能させるには、別のスレッドで処理を実行し、必要に応じて と通信するEVT必要があります。Java 6 が利用可能な場合は、SwingWorkerがこれを行うための最良の方法になります。

于 2009-10-23T20:50:44.087 に答える
1

イベントのすべての再描画と処理は、AWT イベント ディスパッチ スレッド (EDT) で行われます。そうでない場合は、マルチスレッドを処理することになりますが、これは GUI にとってあまり実用的ではありません。

解決策は、ブロッキング処理を別のスレッドで実行することです。を使用して EDT でコードを実行し、GUI を更新しjava.awt.EventQueue.invokeLaterます。これはマルチスレッドであるため、非常に注意する必要があります。特に、ロックする必要がないように、スレッド間で転送されるオブジェクトの不変性を優先するという一般的なアドバイスがあります。また、多数の小さなロックよりも幅の広いロックを少数使用しますが、それでもコールバックには注意してください。

避けてくださいSwingWorker。デモが短くなります。ただし、製品コードの場合、GUI と非 GUI が密接に結合された設計が強制されます。

于 2009-10-23T20:59:09.720 に答える
1

これが起こることです

クリック
   | |
   -----> 実行されたアクション
              | |
              ----------------> リストを埋める
                                        | | アイテムごとに
                                        --------------------> jlist.addElement()
              | |
              ----------------> jlist をペイントする

リストの塗りつぶしが終了すると、間接的にペイント メソッドが呼び出されます。

その前に結果が必要な場合は、要素を追加するときにリストをペイントする必要があります。

Stefan Kendall が言及しているように SwingWorker を使用すると、これが可能になります。

一般的に言えば、リスト「塗りつぶし」に別のスレッドを同時に使用して、「ペイント」スレッドにGUIを更新するように指示することがあります

クリック
   | |
   -----> 実行されたアクション
              | |
              ----------------> リストを埋める
                                        | | アイテムごとに
                                        --------------------> jlist.addElement()
                                             | |
                                             | | (他のスレッドで)
                                             ----> リストを描画します (これまでの要素で)

              | |
              ----------------> jlist をペイントする

于 2009-10-23T20:59:20.967 に答える