JFrame保持白色或在长时间任务后显示

时间:2015-09-11 17:27:54

标签: java swing concurrency event-dispatch-thread

我无法按照我的意图使我的进度条窗口工作。 目前我可以产生两种不同的情况:

[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

中使用它们

0 个答案:

没有答案