我正在使用 SwingWorker 通过 TCP 连接读取数据并在数据返回时显示。
new SwingWorker<EnvInfoProto, Void>() {
@Override
public EnvInfoProto doInBackground() {
try {
xxx.writeTo(socket.getOutputStream());
return ProtoMsg.parseFrom(socket.getInputStream());
} catch(IOException ignore) { }
return null;
}
@Override
public void done() {
try {
UpdateGui(get());
} catch (Exception ignore) {}
}
}.execute();
Run Code Online (Sandbox Code Playgroud)
当套接字死亡时,就会出现问题,例如在 writeTo 之后,它会永远等待套接字上的输入。一段时间后超时的最简单方法是什么?这是否也是这种情况下的最佳解决方案?在该解决方案中我还会使用 Swingworker 吗?
谢谢
我最初尝试在Java Action Listener中多次更新JFrame和JPanel,但两者都只会在Action Listener完成所有任务时更新.这是我原始问题的链接(在Action Listener中刷新JFrame).
我在反馈中被告知Swing Worker应该解决我的问题.但是,当我实现Swing Worker(如下所示)时,没有任何改变.仅当Action Listener完成所有任务时,JFrame和JPanel仍会更新.我的问题是,我错过了下面的内容吗?如果没有,我如何在Action Listener中实现它以及时正确更新Frame和Panel?
@Override
protected Integer doInBackground() throws Exception{
//Downloads and unzips the first video.
if(cameraBoolean==true)
panel.add(this.downloadRecording(camera, recording));
else
panel.add(new JLabel("Could not contact camera "+camera.getName()));
panel.repaint();
jframe.repaint();
return 1;
}
private JLabel downloadRecording(Camera camera, Recording recording){
//does a bunch of calculations and returns a jLabel, and works correctly
}
protected void done(){
try{
Date currentTime = new Timestamp(Calendar.getInstance().getTime().getTime());
JOptionPane.showMessageDialog(jframe, "Camera "+camera.getName()+" finished downloading at "+currentTime.getTime());
}catch (Exception e){
e.printStackTrace();
}
}
Run Code Online (Sandbox Code Playgroud)