2

내 Reader 클래스는 서버가 메시지를 보낼 때마다 서버 메시지를 표시하는 데 사용됩니다. 이 코드는 명령 행에 직접 인쇄 할 때 완벽하게 작동하며, 서버에서 보낸 메시지를 수신합니다. 그러나 JTextArea는 다른 모든 행을 표시합니다. 나는 여기서 무엇을해야할지 모르겠다. InvokeLater에 대해 뭔가 읽었지 만, 이것이 올바른 상황인지는 확신 할 수 없습니다.다른 클래스에서 JTextArea에 추가

또한 연결 단추를 클릭하면 스레드가 GUI 클래스에서 시작됩니다.

public class Reader implements Runnable { 

    public static Socket s = null; 
    public static JTextArea TextArea; 
    public static BufferedReader reader = null; 

    /*Takes in a Socket. Sets up a input stream. 
    * 
    */ 
    public Reader(Socket sIn, JTextArea display) { 
     TextArea=display; 
     s = sIn; 
     try { 
      reader = new BufferedReader(new InputStreamReader(s.getInputStream())); 
     } catch (IOException ex) { 
      System.out.println("Error in constructor Reader: " + ex); 
     } 
    } 

    public void checker() { 
     try { 
      /*Sits and waits for a Server Response*/ 
      while (!reader.ready()) {} 

      System.out.println(reader.readLine()); 
      TextArea.append(reader.readLine()+"\n"); 

     } catch (Exception ex) { 
      System.out.println("checker is crying: " + ex); 
     } 
    } 


    public void run() { 
     while (true) { 
      checker(); 
     } 
    } 
} 

는 응답과 예제 주셔서 감사합니다. 나는 검사기() 메소드에 다음을 추가 한 :

EventQueue.invokeLater(new Runnable() { 
    public void run() { 
     try { 
      TextArea.append(reader.readLine() + "\n"); 
     } catch (Exception eee) { 
      System.out.println("Error" + eee); 
     } 
    } 
}); 

같은 문제가 존재 (단지 다른 모든 서버 메시지 수신)하지만 지금은 다른 모든 메시지를 잠급니다. 내 서버가 4 개의 메시지를 보내는 경우, 첫 번째 메시지를 건너 뛰고 두 번째 메시지를 얻습니다. 도움을 주셔서 감사합니다!

+5

* "InvokeLater에 관한 내용을 읽었지 만 사용하기에 적합한 상황인지 확신 할 수 없습니다."* 예. 어려움이 있으면 한번 시도해보고 다시 찾아 오십시오. –

+0

[예] (http://stackoverflow.com/a/3245805/230513). – trashgod

+0

답장을 보내 주셔서 감사합니다. 내 편집 된 게시물을 참조하십시오. – McScotty89

답변

1

당신은 두 배의 BufferedReader에서 읽고 : 당신은 단지 다른 모든 라인을보고있는 이유

 System.out.println(reader.readLine()); // *** here *** 
     TextArea.append(reader.readLine()+"\n"); // *** and here *** 

가 그래서입니다. 이벤트 스레드에서 readLine()으로 전화를 걸어 프로그램이 정지 될 수 있습니다. 그렇게하지 마십시오.

각 줄마다 한 번만 BufferedReader에서 읽습니다. 나는 또한 while 루프를 바꿀 것이고, 버퍼 된 리더는 외부의 Runnable의을 읽을 것입니다.

private String line = ""; // a class field 

    public void checker() { 
     try { 

     while ((line = reader.readLine()) != null) { 

      System.out.println(line); 
      SwingUtilities.invokeLater(new Runnable() { 
       TextArea.append(line + "\n"); 
      }); 
     } 

     } catch (Exception ex) { 
     System.out.println("checker is crying: " + ex); 
     } 
    } 


    public void run() { 
     checker(); 
    } 

또는 더 나은 - SwingWorker를 객체를 사용하고 JTextArea에에 공정을/라인을 게시 할 수 있습니다.

제쳐두고, 모든 클래스 이름이 대문자로 시작하고 모든 변수와 메소드가 소문자로 시작하는 것을 포함하여 Java 명명 규칙을 배우고 코드를 작성하도록하십시오. 이렇게하면 다른 사람들이 귀하의 코드를보다 쉽고 빠르게 이해할 수있게되며 여기에서 더 빠르고 더 도움을 얻을 수 있습니다.

+0

감사합니다 !! 문제는 당신이 지적한 바로 그 것이 었습니다. 내가 말한대로 reader.readLine()을 두 번 호출했습니다. 그것을 바꾼 후에 ... 그것은 완벽하게 작동합니다! – McScotty89

+0

@ McScotty89 : 다행 이군! –