因此,这是参照我以前的问题here和here。基本上,我遇到的问题是程序进入Server类并停留在那里,因为在服务器代码中有一段时间可以持续侦听来自客户端的任何响应;这使得主窗口完全不可点击,因为程序不在MainWindow类中。
但是我真正想要做的是设置连接,然后返回到MainWindow,这样屏幕上的按钮就可以点击了。或者,正如一张海报所建议的那样,我可以通过引用将MainWindow对象传递给服务器(我已经这样做了),然后使用SwingUtilities.invokeLater(),但是我并不真正希望更新GUI。我希望把控制权还给GUI,这样用户就可以点击按钮之类的了。
当它返回到MainWindow时,我仍然需要连接来保持生命,这样客户端就可以发送东西,我可以接收它,并在屏幕上显示接收到的内容,供用户控制。
发布于 2014-03-27 04:57:59
基本上,您可以使用SwingWorker在后台执行操作,取消事件分派线程,这将允许应用程序继续工作.
SwingWorker<Server , Object> worker = new SwingWorker<Server , Object>() {
@Override
protected ServerdoInBackground() throws Exception {
Server server = new Server();
//...
// Use publish(...) to send information
// back the EDT via the process method...
return server;
}
@Override
protected void done() {
try {
Server server = get();
} catch (InterruptedException | ExecutionException ex) {
ex.printStackTrace();
}
}
@Override
protected void process(List<Object> chunks) {
// You can safly update the UI from here, maybe
// with some messages??
}
};
worker.execute();基本上,这会在Server方法中创建一个新的doInBackground对象,做任何它需要做的事情,否则可能会阻塞EDT并通过返回server实例退出。
如果您希望在done方法完成并获得方法的结果时得到通知,或者如果它抛出异常,则可以使用doInBackground。
publish/process方法可用于将信息发送回EDT,后者可用于更新UI...or not的状态。
现在,如果您已经有了对服务器的引用,可以考虑创建一个自定义SwingWorker,将Server的引用传递给.
Server server = ...;
ConnectionWorker worker = new ConnectionWorker(server);
worker.execute();
//...
public class ConnectionWorker extends SwingWorker<Object, Object> {
private Server server;
public ConnectionWorker(Server server) {
this.server;
}
@Override
protected ServerdoInBackground() throws Exception {
server.doStuff(); //...
return ...;
}
}看看SwingWorker的更多细节
https://stackoverflow.com/questions/22678077
复制相似问题