2011-12-28 2 views
0

간단한 채팅 GUI를 만들고 서버와 GUI 클라이언트를 모두 작성했으며 클라이언트 GUI에서 서버로 메시지를 보낼 수 있습니다.두 가지 이벤트 처리 방법

내 문제는 프레임의 서버에서 메시지를받는 것입니다. 무한 루프를 사용하면 프레임이 잠 깁니다. JTextArea에 메시지를 표시하기 위해 어떻게 분할해야하는지 모르겠습니다. 내 질문 : 서버에서 '보내기'및 '수신'정보를 처리하기 위해 프레임을 분할하는 방법이 있습니까?

내 GUI는 JTextField, JTextAreaJButton으로 구성됩니다.

눌러 JButtonJTextField에서 텍스트에 의해 서버로 전송되는 경우 :

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

하지만 내가 JTextArea 얻을에 의해 정보를 주셔서 모든 시간을 줄이기 위해 무엇을해야하는지 모르겠어요

보이는 내가 스레드 evrything 만들어 때문에 //

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

스레드는 GUI 클래스의 클래스 또는 구성 요소를이어야한다 일하고 있지만 마사지는 jTextField에 apear 없습니다. 나는 서버에 내가 같은 파일에했던 것처럼 스레드를했지만 작동하지 않습니다 :

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를 사용하는 동안 또는 사용하지 않고 시도했습니다.

 SwingUtilities.invokeLater(
     new Runnable(){ 
      public void run(){ 
       while(true){ 
       try{ 
        msg = in.readUTF(); 
        jta.append(msg + "\n"); 
        jta.revalidate(); 
       } 
       catch(IOException ioe){ 

       }}}}); 

답변

1

백그라운드 스레드에서 무한 수신 루프를 실행해야합니다.

1

백그라운드 스레드에서 GUI 구성 요소를 업데이트하지 마십시오. SwingUtilities.invokeLater를 사용해보고, 텍스트 영역에 revalidate()와 같은 것을 사용하는 것을 잊지 마십시오.