我做了一个简单的聊天服务器/客户端,遇到了这个问题
当用户单击按钮时,我希望按钮变为"disconnect",在JTextPane对象上编写一些东西并进行连接。
问题是在建立连接之前什么都不会更新,按钮卡住了,而且对JTextPane对象的任何写入都只在连接之后(大约5-10秒)才能看到。
有什么解决方案/建议吗?
connectButton.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
if (!running) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
connectButton.setText("disconnect");
}
});
running = true;
connect();
}
else {
connectButton.setText("connect");
running = false;
disconnect();
}
}发布于 2014-05-13 07:14:24
基本上,你阻塞了事件调度线程,阻止它处理绘图请求。
查看Concurrency in Swing以了解发生了什么,并考虑使用SwingWorker在单独的线程中执行连接,特别是如果您希望在执行连接时以某种方式更新UI。
发布于 2014-05-13 14:51:50
Swing代码在单线程中执行,actionPerformed()-Method也是如此。只需启动一个新线程或创建一个runnable并使用SwingUtils.invokeLater()启动它:
示例:
javax.swing.SwingUtilities.invokeLater(new Runnable() {
public void run() {
//do something
}
});https://stackoverflow.com/questions/23620233
复制相似问题