我正在使用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设置文本时它没有显示在表单中?任何帮助将不胜感激!
答案 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以反映更改。