我无法按照我的意图使我的进度条窗口工作。 目前我可以产生两种不同的情况:
[1] 执行长任务后,progress bar
的我的框架可见。这不是故意的,因为progress bar
可以显示当前的进展。
[2] 我的框架在此之前弹出,表示长任务但保持完全空白,这意味着不会在其上绘制任何组件。
对于情况1 我使用了这个(神秘的代码):
SwingUtilities.invokeLater(new Runnable() {
public void run() {
// Initialise and draw my JFrame here
}
});
对于情况2 ,我使用了这个
// Initialise without going into Event Dispatch Thread, that means without calling invokeLater();
在两种情况下更新我使用此SwingWorker
的JFrame
SwingWorker<Void,Integer> sw = new SwingWorker<Void,Integer>(){
@Override
protected Void doInBackground() throws Exception {
// do long task here and use setProgress() to activate Property Change
}
return null;
}
@Override
protected void process(List<Integer> chunks){
System.out.println(chunks);
}
};
sw.addPropertyChangeListener(new PropertyChangeListener(){
@Override
public void propertyChange(PropertyChangeEvent arg0) {
if("progress".equals(arg0.getPropertyName())){
// update Components on Jframe with arg0.getNewValue();
}
}
});
sw.execute();
我想要情境1 ,但我的组件在进度中是可见的。 调用invokeLater();在任务之后显示我的框架,而不是那个
这是我正在使用的完整源代码:
private static JProgressBar progressBar = null;
private static JFrame convf = null;
private static MyConverter conv;
private static JLabel statuscounter;
private static JLabel currentfile;
private static GridBagConstraints c;
标记后,我用我用于进度条的方法初始化它们。
convf = new JFrame("Progress");
convf.setLayout(new GridBagLayout());
c = new GridBagConstraints();
c.ipadx = 50;
c.ipady = 10;
c.insets = new Insets(10, 10, 10, 10);
convf.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
statuscounter = new JLabel();
convf.add(statuscounter, c);
currentfile = new JLabel();
c.gridx = 1;
convf.add(currentfile, c);
c.gridx = 0;
c.gridy = 1;
c.gridwidth = GridBagConstraints.REMAINDER;
convf.setLocationRelativeTo(null);
progressBar = new JProgressBar(0, tempFiles.size());
progressBar.setValue(0);
convf.add(progressBar, c);
convf.pack();
convf.setVisible(true);
某些变量是静态的,因为我需要在worker class