2013-08-22 2 views
0

run() 메서드로 업데이트하는 코드가 있습니다.JTextArea가 멀티 스레딩에서 작동하지 않습니다. -

그러나 run 메서드를 실행하면 append() 메서드가 실행되지 않습니다.

incomingMessage의 커서 값을 인쇄하지만 JTextArea에는 추가되지 않습니다.

public void run() 
{ 

    while (true) 
    { 
     try 
     { 
      if(serverSocketMessage==null) 
      { 
       serverSocketMessage = new ServerSocket(Constants.INCOMING_MESSAGE_PORT); 
      } 
      System.out.println("Listening to incoming messages"); 

      ObjectInputStream objectInputSender; 
      String incomingMessage = null; 

      serverMessage = serverSocketMessage.accept(); 
      objectInputSender = new ObjectInputStream(serverMessage.getInputStream()); 
      Object objectMessage = objectInputSender.readObject(); 
      if (objectMessage instanceof String) 
      { 
       incomingMessage = objectMessage.toString(); 
       System.out.println("\nMessage\n"+incomingMessage); 
       if(incomingMessage!= null) 
       { 
        chatingJTextArea.append(incomingMessage); 
        System.out.println("Not null"); 
       } 

       chatingJTextArea.append("\n"); 
       chatingJTextArea.append(incomingMessage); 



      } 
     } 
     catch(Exception e) 
     { 
      e.printStackTrace(); 
     } 

    } 
+2

JTextArea의 추가 메서드는 Swing의 스레드 안전 규칙에 대한 예외입니다. http://docs.oracle.com/javase/6/docs/api/javax/swing/JTextArea.html#append(java.lang.String) 문서에 따르면 다른 스레드에서 JTextArea를 추가 할 수 있습니다. – Bill

+3

@Bill은 JDK7 javadoc에서 해당 주석을 제거했습니다. 그리고 내 자신의 경험으로 볼 때 이전 JDK에서는 스레드가 안전하지 않았던 것 같습니다 – Robin

+0

흥미 롭습니다. 정보 주셔서 감사합니다! – Bill

답변

4

SwingWorker를를 사용하여 처리를 구현하는 것 EDT

private void addMessage(final String message) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      chatingJTextArea.append(message); 

     } 
    }); 
} 
+0

+1 - 더 많은 장소가 있기 때문에이를 사용자 정의 방법으로 가장 잘 포장하십시오. ... – mihi

+0

@Reimeus if 조건에서 addMessage (incomingMessage)를 호출하여 시도했지만 작동하지 않습니다. – Kundan

+0

@Kundan addMessage가 호출되고 있습니까? 나는. 'readObject'에 의해 실제로 돌려 주어지는 형태는 무엇입니까? 'readObject'는 일반적으로 이진 데이터를 읽는 데 사용됩니다 ... – Reimeus

-1

용액에 추가 호출하십시오. doInBackground 메소드는 처리를 구현할 것이고 인수로 추가 할 String으로 publish 메소드를 호출 할 것이다. 그런 다음 SwingWorker는 process 메소드를 재정 의하여 String 인수를 가져 와서 텍스트 영역에 추가합니다.

의견을 작성할 수있는 충분한 권한이 없지만 잘못되었다고 말한 부분을 삭제했습니다.

+0

\t \t \t \t \t \t { \t \t \t \t \t //chatingJTextArea.append(incomingMessage); \t \t \t \t \t \t System.out.println ("in function value"+ incomingMessage); \t \t \t \t \t \t addMessage (incomingMessage); \t \t \t \t \t \t System.out.println ("Not null"); \t \t \t \t \t} – Kundan

+0

-1 (jTextArea.getGraphics()). 스윙 컴포넌트는 속성이 변경되면 자동으로 다시 칠합니다. 어떤 이유로 컴포넌트를 다시 칠할 필요가 있다면'repaint()'메소드를 사용할 것이다. – camickr

관련 문제