0

Java Socket Swing アプリケーションを作成しています。私はこのボイドを作成しました:

private static void sendMessage(JTextField message) {
    try {
        String data = user + ": " + message.getText();
        out.println(data);
        System.out.println(in.readLine());
    }
    catch(Exception exc) {
        JOptionPane.showMessageDialog(dpanel,
            "Could not send message. Reason: " + exc, "",
            JOptionPane.ERROR_MESSAGE);
    }
}

2 番目のメッセージをサーバーに送信しようとすると、プログラムが動かなくなります。誰かが私のコードの推奨事項を提供できますか? ありがとう!

PS

sendMessage()によってトリガーされMouseLisitenerますJButton。forと out to a があり
ます。 これは、in out と connection とは次のとおりです。PipeStreamSystem.errJTextArea

try {
    connection = new Socket(ipa, port);
    out = new PrintWriter(connection.getOutputStream(), true);
    in = new BufferedReader(new InputStreamReader(connection.getInputStream())));
}
...
4

3 に答える 3

3

問題:

  • なぜ静的メソッドなのですか? 正当な理由がない限り、すべての静的を避けるべきであり、ここにはありません。
  • スレッドの処理方法については言及していません。おそらく、これが問題の原因となっている可能性があります。バックグラウンド スレッドの作成に SwingWorker を使用していますか? Swing イベントスレッドですべての Swing 呼び出しを行うように注意していますか?
  • あなたは JButton に MouseListener を使用させていると述べていますが、これは良い習慣ではありません。JButton は、ActionListener に最適に応答するように作成されました。これにより、JButton の状態に対する視覚的な変化がトリガーされ、JButton を無効にすることでアクションを無効にすることもできます。詳細については、「Oracle Swing チュートリアル ボタン」セクションを読むことをお勧めします。
于 2013-01-15T00:25:33.200 に答える
3

イベントディスパッチスレッドのコンテキスト内から潜在的にブロックする I/O を呼び出そうとしているようです。これは決して良い考えではありません。EDT をブロックするものはすべて (とりわけ) 再描画要求を停止し、EDT によるマウスおよびキーボード イベントの処理を停止します...

UI とのすべての対話 (作成と変更) は、EDT のコンテキスト内から行う必要があります。

背景については、 Concurrency in Swingをご覧になることをお勧めします...

あなたの場合、Threadソケットを介してデータを送受信できるバックグラウンドワーカーが必要になります。これにより、送信中のメッセージをキューに入れ、EDT をブロックすることなく結果を処理できます。

しかし、これが実際にどのように実装されるかは、要件が正確に何であるかにかかってきます...

于 2013-01-15T00:25:56.517 に答える
0

void部分を削除してマウスリスナーに入れて、メッセージを送信するたびに接続を開閉しました。これにより、プログラムのクラッシュが防止されました。私の間違いに気付くのを手伝ってくれてありがとう。

于 2013-01-15T15:21:53.067 に答える