Java Swing更新
这是关于我之前的问题和建议。基本上,我遇到的问题是程序进入Java Swing更新,java,swing,class,sockets,tcp,Java,Swing,Class,Sockets,Tcp,这是关于我之前的问题和建议。基本上,我遇到的问题是程序进入服务器类并停留在那里,因为服务器代码中有一段时间的外观,基本上一直在监听端口以获取客户端的任何响应;由于程序不在MainWindow类中,这使得主窗口完全不可访问 但我真正想让它做的是设置连接,然后返回到main窗口,这样屏幕上的按钮就可以点击了。或者,正如一张海报所建议的,我可以通过引用将MainWindow对象传递给服务器(我已经这样做了),然后使用SwingUtilities.invokeLater()。我希望将控制权交还给GUI,
服务器
类并停留在那里,因为服务器代码中有一段时间的外观,基本上一直在监听端口以获取客户端的任何响应;由于程序不在MainWindow
类中,这使得主窗口完全不可访问
但我真正想让它做的是设置连接,然后返回到main窗口
,这样屏幕上的按钮就可以点击了。或者,正如一张海报所建议的,我可以通过引用将MainWindow对象传递给服务器(我已经这样做了),然后使用SwingUtilities.invokeLater()。我希望将控制权交还给GUI,以便用户可以单击按钮等
当它返回到主窗口时
,我仍然需要连接保持活动状态,以便客户端可以发送东西,我可以接收它,并在屏幕上显示接收到的内容供用户控制。基本上,您可以使用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();
查看更多详细信息以及使用a与服务器对话有什么问题?@MadProgrammer那么我会使用主窗口
类中的SwingWorker,以便单独设置连接吗?我不太清楚SwingWorker是如何工作的…即使在阅读了文档之后…@MadProgrammer,所以如果我理解正确,我似乎会设置这样一个对象:SwingWorker-worker=new SwingWorker…
,其中包含需要在此worker对象内执行的函数。但是,服务器是一个完整的类,因此如何将其封装到SwingWorker对象中?
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 ...;
}
}