从runnable类更新swing JEditorPane

时间:2014-03-25 18:54:44

标签: java multithreading swing runnable settext

我正在使用intellij想法用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设置文本时它没有显示在表单中?任何帮助将不胜感激!

2 个答案:

答案 0 :(得分:1)

(几乎)所有对Swing类的方法的调用,包括组件,都应该从Event Dispatch Thread中进行。

更改updateData方法:

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

答案 1 :(得分:0)

让事件调度程序线程处理您的更新包装

中的调用
SwingUtilities.invokeAndWait()

它会阻止当前线程并将控制传递给EDT以反映更改。