4

私はソケットプログラミングを書いています。サーバーとクライアントの GUI があります。サーバー GUI には、ユーザーが要求した単語を表示するテキストフィールドがあります。しかし、私は単語を表示するのに問題があります。

私が試してみました

txtWord.setText(sentword);

テキストフィールドに単語が表示されていません。でも、これを書くときは

txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);

次に、テキストフィールドに単語を表示し、メッセージボックスにも表示します。

repaint() を試しましたが、うまくいきません。できるだけ早く解決策を提案してください

4

2 に答える 2

9

@BinyaminSharetが正しくコメントしているように、Swingの同時実行の問題があります。

  • Swing GUIバックグラウンドで実行している長くて難しいタスクを気にしません

  • JTextField#setText()スレッドセーフとして宣言されていてもSocket、デフォルトでは(つまり)からの出力は通知されません。イベントディスパッチスレッド

  • 正しい方法は、Swing GUIのバックグラウンドで長くて難しいタスクを実行し、イベントスレッドまたはEDTでGUIに出力するために特別に作成されたSwingWorkerを使用することです。

  • またはさらに簡単なのは、でを使用するRunnableことですが、それをRunnableに配置して呼び出すことにより、Threadへのすべての出力がSwingイベントスレッドのキューに入れられるようにします。Swing GUIinvokeLater()

  • 汚いハックは、次のようにコード行をラップすることです。

txtWord.setText(sentword);
JOptionPane.showMessageDialog(null, "the requesed word is: "+sentword);

invokeLater()、しかしこの場合、GUIは(あなたの場合)終了するまでMouseまたはKeyboardイベントに応答しなくなりますSocket

于 2012-09-23T06:23:30.840 に答える
-1

txtWord.requestFocus(); textField は、ウィンドウが textField の上に戻って戻るまで、またはウィンドウがフォーカスされるまで、クリックするまで表示されません。だから... フォーカスをリクエストしてください。

また、作成時に設定した場合はテキスト サイズを確認してください。サイズに不一致がある場合、テキストが表示されないことがあります。例: txtWord.setSize(200, 24);

于 2012-09-23T06:34:18.617 に答える