0

これが私がやろうとしていることです:

進行中の接続に関する表示更新をJFrame含むがあります。接続をキャンセルしたい場合、JTextAreaユーザーはその右側にある を押すことができるはずです。JButtonただし、接続しようとしている間、接続がスレッドをブロック (使用) しているため、GUI がフリーズします。私は迅速な修正を探しています。ActionListenerおそらく別のスレッドを持っていますか?ランナブルを基本的に使用することはできますが、スレッドの経験はあまりありません。

答えは EDT の使用と関係がありますか? もしそうなら、これはどのように実装されるべきですか?

PS を明確にするために、ボタンは接続を作成するスレッドを強制終了できる必要があります。読んだ後、executorService. これを助けることができますか?はい?またはまったくありませんか?

4

2 に答える 2

5

最初に、Swing (またはほぼすべての UI フレームワーク) とマルチスレッドについて理解することをお勧めします。これはナプキンバージョンです:

  • UI の変更または UI からの読み取り (たとえば、テキストフィールドの値を取得するため)は、UI スレッド (「スイング スレッド」または「イベント ディスパッチ スレッド」(EDT) とも呼ばれる) でのみ実行する必要があります。
  • ネットワーク通信などのブロッキングまたは長時間実行される操作は、UI スレッドで実行してはなりません。そうしないと、ボタンが機能しなくなったり、テキストが更新されなくなったりします。
  • Java では、ExecutorServiceとその仲間により、バックグラウンド スレッドで実行時間の長いものやブロックしているものを比較的簡単に実行できるようになります。
  • UI の更新が必要なバックグラウンド スレッドで何かが発生した場合は、UI 関連のコードをEventQueue.invokeLater呼び出しにカプセル化します。これにより、Runnable渡したものが UI スレッドで実行されるようになります。

このSwingWorkerクラスはこのロジックをカプセル化し、より単純な場合に使いやすいヘルパーを提供します。

初めてこれを行うときは少し気が遠くなるかもしれませんが、これを完全に理解することは報われます。なぜなら、これは Swing だけでなく、他の UI コードにも当てはまるからです。

于 2013-04-29T11:56:23.670 に答える
1

明確にするために、ボタンは接続を作成するスレッドを強制終了できる必要があります。読んだ後、executorService. これを助けることができますか?はい?またはまったくありませんか?

はい

  • while(localBooleanVariable)内側Runnable#Thread、地糸

  • を使用してSwingWorker.cancel()

  • SwingWorkerはキャンセル可能で、 から出力されるため、 publish()EDTprogress()にある

于 2013-04-29T11:00:05.610 に答える