【发布时间】:2013-11-05 17:10:05
【问题描述】:
我最初尝试在 Java Action Listener 中多次更新 JFrame 和 JPanel,但只有在 Action Listener 完成所有任务时才会更新。这是我原来的问题(Refreshing a JFrame while in an Action Listener)的链接。
在对该问题的反馈中,有人告诉我 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();
}
}
【问题讨论】:
-
你不应该在任何swing对象上调用任何方法,也不应该从
doInBackground方法内部构造任何swing对象,也不应该直接调用任何这样做的方法。您对.add、.repaint、new JLabel的doInBackground呼叫均违反此规则。只能从 SwingWorker 的process或done中修改 gui。
标签: java swing jframe swingworker