java - 从可运行类更新 swing JEditorPane

标签 java multithreading swing runnable settext

我正在使用 intellij idea 使用 Swing 编写这个 java 服务器程序,我正在尝试从我的主类创建一个线程,该线程将启动服务器并更新另一个类中的 JEditorPane。到目前为止,我的代码很长。

public class ServerClass implements Runnable {

    private ClassWithLog statusLog = new ClassWithLog();

    public ServerClass() {
        startServer.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                startServer();
            }
         });
    }

    private void startServer() {
        new Thread(this).start();
    }

    public void run() {
       .. Receive packet stuff here ..
       statusLog.updateData("Received...");

    }

}

比起我的日志记录类,它是一种不同的形式,包含如下代码:

public class ClassWithLog {

    public ClassWithLog() {
       .. all the action listeners for swing..
    }

    public void updateData(String data) {
        logControl.setText(logControl.getText() + data);
    }
}

我在 updateData 方法中设置了一个断点,我看到数据正在获取我需要的字符串,但是当 logControl 设置文本时它没有显示在表单中?任何帮助将不胜感激谢谢!

最佳答案

(几乎)所有对 Swing 类(包括组件)方法的调用都应该从事件调度线程进行。

更改您的 updateData 方法:

public void updateData(String data) {
    EventQueue.invokeLater(new Runnable(){
        logControl.setText(logControl.getText() + data);
    });
}

关于java - 从可运行类更新 swing JEditorPane,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/22643808/

相关文章:

java - SUM 函数和 GROUP BY 的列索引无效

java - 多个节点选择的操作

android - android handlemessage可以重入吗?

multithreading - Delphi 服务无法自行停止

java - 使用表值填充组合框

java - 关于连续减法

java - JDBC 调用 Microsoft SQL Server 存储过程的同义词

java - Eclipse 的 Refactor > Move 可以和 Git 集成吗?

c# - 我怎样才能有两个独立的任务调度程序?

java - 打开 jdialog 后更新 jlabel 文本