0

簡単なサーバークライアントプログラムをセットアップしました。ユーザーが接続のリッスンを開始すると、「接続をリッスンしています」というメッセージと [キャンセル] ボタンが表示されたダイアログが表示されます。キャンセルを押すと、サーバー ソケットが閉じられます。それは大丈夫です。

私が望むのは、接続が確立されたときに「Listening...」ダイアログを非表示にすることです。

現在、ListenDialog は実行可能です。accept()そこに入れようとしたか、while(true), if socket != null, dispose();...何も機能しませんでした。ダイアログはモーダルとして設定されます。そうしないと、accept()ブロックとダイアログ GUI (つまり、キャンセル ボタン) が描画されないためです。別のスレッドにある必要があるように見えても、run()メソッドでさえブロックが停止するまで実行されません。accept()

したがって、dispose()ダイアログのrun()メソッドを挿入してダイアログを非モーダルにするだけで、必要な終了機能を取得できます...しかし、GUIをペイントすることはないため、キャンセルボタンは使用できません。ダイアログをモーダルにすることで GUI とキャンセル ボタンを取得できますがaccept()、メソッドのブロックが停止した後でも、run()何もしないようです (つまり、ダイアログは手動で閉じるまでそこに留まり、run()コードも実行されません)。

私が見逃している明らかなものがあることを教えてください!

ListenDialog listener = new ListenDialog();

Thread listenThread = new Thread(listener);
listenThread.start();

try {
    socket = server.accept();
    listener.dispose();
} catch(IOException e1) {
    addMessage("Accept Failed: " + e1.getMessage());
}
4

1 に答える 1

0

わかりました、この解決策がどのように機能したか、または私が試した他のこととの重要な違いが何であったかは100%わかりません...しかし、ここにあります.

nowのコンストラクターには、ListenDialogそれ自体の新しいスレッドの作成が含まれています。run()メソッドには、try/catch ブロックの外側に続く呼び出しが含まれていますaccept()dispose()上記のすべてのコード ( new の作成を除く) は、クラスListenDialogに移動されています。ListenDialog

于 2012-09-26T20:34:41.123 に答える