2

カード リーダーを操作するための GUI を作成しました。これは主に、FileChooserダイアログを表示し、選択Fileしたものを CardHopper にキューに入れる [ADD] ボタンで構成されていJListます。

今、私はCPU(別JFrameのスレッド上の別の)がカードリーダーの要求を行えるようにしたいと考えています。例えば、カードを読んで私に送ってください。カードリーダーが GUI を持つ前は、CPU と同じスレッドで動作するモデルだったので、そのreadCard()メソッドを呼び出すだけで済みました。別のスレッドになったので、通信する正しい方法はメッセージパッシングを使用することのようです。

を使用して何かを実装しようとしていましたPriorityBlockingQueue。これにより、CPU はputキューでカード読み取りコマンドを実行し、CardReader はtakeそのコマンドを実行しますが、CardReader スレッドは通常、NetBeans が提供する Swing コード内のどこかでブロックされることに気付きました。 GUIイベントを待っていて、イベントキューに何かが到着するのを知らない. さらに、この「バックエンド」要求はデータ モデルを変更します。そのため、モデル内で何らかのコードを実行できListDataListenersたとしても、GUI が GUI イベントを待機している間に GUI に通知を「起動」するのはコーシャーでしょうか?

これが難解すぎないことを願っています。私はまだ、GUI とスレッドの仕組みについて理解を深めようとしています。

4

1 に答える 1

4

GUI が GUI イベントを待っている間に、GUI の ListDataListeners への通知を「起動」するのはコーシャでしょうか?

絶対違う。

やりたいことは、UI のモデルを直接操作する (または UI 関数を呼び出す) すべてのタスクを Swing イベント スレッドで実行することです。

基本的に、何らかの UI タスクを実行するイベントを投稿する準備ができたら、次のようにします。

SwingUtilities.invokeLater(new Runnable() {
  public void run() {
     ...
  }
}

Swing スレッドでのみ実行されるため、すべてのリスナーを起動し、そこで ListModel (または他の UI モデル) に対して必要なことを行うことができます。

そうしないと、Swing が描画中にデータを読み込もうとしてデータを更新する危険があります。NullPointerException、ArrayIndexOutOfBoundExceptions、ConcurrentModifictionException などを取得し始めます。

理想的には、すべてのバックグラウンド作業を別のスレッド (または SwingWorker の下) で実行し、すべての準備が整ったら、invokeLater を介して更新をプッシュします。

于 2011-07-18T20:23:43.663 に答える