2011-12-28 9 views
0

私は簡単なチャットGUIを作成しており、サーバーとGUIクライアントの両方を作成しており、クライアントGUIからサーバーにメッセージを送信できます。2つの異なるイベントを処理する方法

私の問題は、フレーム上のサーバーからメッセージを受信することです。 無限ループを使用すると、フレームがロックされます。 JTextAreaにメッセージを表示するには、どのように分割するべきか分かりません。 私の質問は: サーバーから「送信」と「受信」情報を処理するフレームを分割する方法はありますか?

私のGUIは、JTextField,JTextAreaおよびJButtonで構成されています。

プレスJButtonJTextFieldからのテキストがでサーバーに送信された場合:

String u = jTextField.getText(); 
out.writeUTF(u); 

しかし、私はJTextArea取得することで情報を今後のためにすべての時間を減らすために何をすべきか分からない:

msg = in.readUTF(); 
jta.append(msg + "\n"); 

//

私はスレッドevrythingは思えてきたので、スレッドは、GUIクラスでクラスやコンポーネントであるべきうまくいきますが、マッサージはjTextFieldにありません。私は、同じファイルで行ったサーバーのように糸を作ったが、動作していない:

class bacgroundTask extends Thread{ 
static String msg; 
static JTextArea jta; 
static DataInputStream in; 
public void run(){ 
     while(true){ 
      try{ 
      msg = in.readUTF(); 
      jta.append(msg + "\n"); 
      } 
      catch(IOException ioe){}}}} 

//

こんにちは、それは私が実行されたとき、私はできませんinvokelater方法が、フレームfrezzeを使用しようと再び私ですボタンを押すか、jtextfieldにテキストを入力してください。どんな体でも私のことをもう少し詳しく説明でき、私の場合は正しいですか?

私はstetmentの有無にかかわらず試しました。

答えて

1

バックグラウンドスレッドで無限受信ループを実行する必要があります。

1

バックグラウンドスレッドでGUIコンポーネントを更新しないでください。 SwingUtilities.invokeLaterを使ってみてください。そして、あなたのテキスト領域にrevalidate()のようなものを使うのを忘れないでください。

関連する問題