Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/370.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
JTextArea在多线程中不工作-java_Java_Multithreading_Swing_Jtextarea - Fatal编程技术网

JTextArea在多线程中不工作-java

JTextArea在多线程中不工作-java,java,multithreading,swing,jtextarea,Java,Multithreading,Swing,Jtextarea,我有一个更新run()方法中JTextArea的代码 但是当run方法执行时,不会执行append() 它打印incomingMessage变量的当前值,但不会附加到JTextArea public void run() { while (true) { try { if(serverSocketMessage==null) { serverSocketMessage

我有一个更新
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();
        }

    }

尝试在
EDT

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

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

        }
    });
}

尝试在
EDT

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

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

        }
    });
}

解决方案是使用SwingWorker实现处理。doInBackground方法将实现该处理,您将调用publish方法,并将附加字符串作为参数。然后,SwingWorker将重写process方法以获取字符串参数并将其附加到文本区域


我没有足够的特权对此发表评论,但我删除了你所说的错误

解决方案是使用SwingWorker实现处理。doInBackground方法将实现该处理,您将调用publish方法,并将附加字符串作为参数。然后,SwingWorker将重写process方法以获取字符串参数并将其附加到文本区域


我没有足够的特权对此发表评论,但我删除了你所说的错误

+1-由于有更多的地方,最好将其包装到自定义方法中。您可能需要将方法参数incomingMessage
设置为final
才能编译…@Reimeus我在if条件下调用addMessage(incomingMessage)进行了尝试,但它不是working@Kundan您确定正在调用addMessage吗?也就是说,
readObject
返回的类型实际上是字符串吗
readObject
通常用于读取二进制数据…@Reimeus yes yes调用它。我尝试将addMessage的数据打印到该方法中,readObject是一个字符串。@Kundan将代码作为一个字符串发布,以便我们可以看到完整的图片+1-由于位置更多,最好将其包装到自定义方法中。您可能需要将方法参数incomingMessage
设置为final
才能编译…@Reimeus我在if条件下调用addMessage(incomingMessage)进行了尝试,但它不是working@Kundan您确定正在调用addMessage吗?也就是说,
readObject
返回的类型实际上是字符串吗
readObject
通常用于读取二进制数据…@Reimeus yes yes调用它。我试图将addMessage的数据打印到该方法中,readObject是一个字符串。@Kundan将代码作为一个字符串发布,这样我们就可以看到完整的pictureJTextArea的append方法是Swing中线程安全规则的一个例外。根据文档,您可以从其他线程附加到JTextArea。@Bill他们在JDK7 javadoc中删除了该注释。根据我自己的经验,在早期的JDK中,它并不是线程安全的。谢谢你的信息!JTextArea的append方法是Swing中线程安全规则的一个例外。根据文档,您可以从其他线程附加到JTextArea。@Bill他们在JDK7 javadoc中删除了该注释。根据我自己的经验,在早期的JDK中,它并不是线程安全的。谢谢你的信息!如果(incomingMessage!=null){//chatingJTextArea.append(incomingMessage);System.out.println(“函数值内”+incomingMessage);addMessage(incomingMessage);System.out.println(“非null”);}-1用于更新(jTextArea.getGraphics())。属性更改时,Swing组件将自动重新绘制自身。如果出于某种原因需要重新绘制组件,则可以使用
repaint()
方法。If(incomingMessage!=null){//chatingJTextArea.append(incomingMessage);System.out.println(“in function value”+incomingMessage);addMessage(incomingMessage);System.out.println(“Not null”);}-1进行更新(jTextArea.getGraphics())。属性更改时,Swing组件将自动重新绘制自身。如果出于某种原因需要重新绘制组件,则可以使用
repaint()
方法。