2013-08-22 21 views
0

我有在run()方法更新JTextArea代码。JTextArea中的多线程不工作 - java的

但当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中的append方法是一个例外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

尝试调用所述EDT

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

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

     } 
    }); 
} 
+0

+1 - 因为有更多的地方,最好把它包装成一个自定义的方法。你可能必须使方法参数incomingMessage'最后'为此编译... – mihi

+0

@Reimeus我试图通过在if条件中调用addMessage(incomingMessage),但它不起作用 – Kundan

+0

@Kundan你确定addMessage被调用吗?即'readObject'返回的类型实际上是一个String? 'readObject'通常用于读取二进制数据... – Reimeus

-1

溶液追加将使用的SwingWorker来实现该处理。 doInBackground方法将实现处理,您将调用publish方法并将String作为参数进行追加。然后,SwingWorker会覆盖处理方法以获取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( “在函数值” + 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())。当属性发生变化时,Swing组件会自动重新绘制自己。如果由于某种原因需要重新绘制一个组件,那么您将使用'repaint()'方法。 – camickr