2

ソケット通信と他のスレッドを備えたSwingアプリケーションがあります。SwingUtilities.invokeLater()他のスレッドからSwing表示を更新するために使用する必要があることはわかっています。しかし、どうJOptionPaneですか?SwingUtilities.invokeLater()起動するために他のスレッドから使​​用する必要がありJOptionPaneますか?

答えが「はい」の場合、JOptionPaneを使用してプロシージャをブロックするにはどうすればよいですか?

答えが「いいえ」の場合、JOptionPaneはGUIディスプレイに属していませんか?

4

3 に答える 3

2

はい、JOptionPane を起動するには を使用する必要がありますSwingUtilities.invokeLater()。そうしないと、JOptionPane が応答しない可能性があります。これはモーダル コンテナであるため、デフォルトでメイン コンテナへの入力をブロックする必要があります。詳細については、 http://docs.oracle.com/javase/6/docs/api/javax/swing/JOptionPane.htmlを参照してください。

于 2012-12-13T16:11:10.270 に答える
2

答えはイエスです。Swing コンポーネントは EventQueue からのみ呼び出す必要があります。Is JOptionPane.showMessageDialog スレッドセーフですか?をご覧ください。

于 2012-12-13T16:12:52.587 に答える
2

答えが「はい」の場合、JOptionPane を使用して手順をブロックする方法

答えはイエスです。Event Dispatch Thread 上のすべての Swing コンポーネントにアクセス/変更/...する必要があります。したがって、バックグラウンド スレッドは、何らかのメカニズムを使用JOptionPaneして EDT で を呼び出す必要があります。使用SwingUtilities#invokeLaterはオプションですが、ブロックするものではありません。

SwingUtilities#invokeAndWaitブロック動作に使用します。このメソッドは、ランナブルが終了するまで待機してから戻ります。

于 2012-12-13T20:04:56.223 に答える