如何从SwingWorker doInBackground内部调用JFileChooser并等待回答?

时间:2015-08-18 22:25:18

标签: java swing swingworker

我的SwingWorker doInBackground读取多个Excel文件并执行一些冗长的计算。这些文件具有默认名称和位置,但是当找不到默认文件时,我需要显示“打开文件”对话框并等待用户选择替换文件。
我试图使用publish()和我的Open ..对话框很好地显示,但doInBackground继续执行并且不等待。我怎么能完成它?

private class DataTask extends SwingWorker<Void,Object>{

@Override
protected Void doInBackground() throws InterruptedException  {
    int progress = 0;

    setProgress(0);

    for (i = 1; i < 10; i++) {
       processDescText = "read file "+i+"...";

       try {
            File f = new File(fileName[i]);
            if(!f.exists()) {
               // here I need to show open file dialog and wait for input
               // ...
               fileName[i] = userInput;
            }
            FileInputStream fis = new FileInputStream(fileName[i]);
            XSSFWorkbook workbook = new XSSFWorkbook(fis);
            fis.close();
            setProgress(i);

           // perform my calculations here 
        }         
        catch (IOException ex) {
        }
    }
    return null;
}

}

3 个答案:

答案 0 :(得分:2)

简短的回答是,不要。这将违反Swing的单线程规则。相反,事先收集List个文件,根据需要提示用户;获得List个文件后,只需将其传递给SwingWorker

SwingWorker应该只关注处理文件,其他任何事情都应该产生异常。

答案 1 :(得分:0)

为什么没有notRach = User.query.filter_by(name!='Rachmaninoff') # queries for all users whose name isn't Rachmaninoff 存储boolean是否已完成,以及JFileChooser调用doInBackground()中的wait()循环,其条件为while。完成boolean后,将JFileChooser设置为boolean并致电true

答案 2 :(得分:0)

如上所述,Vanza可以使用SwingUtilities.invokeAndWait。无法直接在SwingWorker.doInBackground方法内调用Swing GUI函数,因为根据设计,此方法内的代码将不会在事件调度线程中运行。实际上,如果此方法在事件分发线程中运行,将引发异常。 Swing GUI只能在事件调度线程中更新。

class MyWorker extends SwingWorker<Integer, Integer> {
    boolean answer = false;
    public Integer doInBackground() throws Exception {
        System.out.println("doInBackground  >" + SwingUtilities.isEventDispatchThread() + "<");
        for (int i = 0; i < 5; i++) {
            answer = false;
            SwingUtilities.invokeAndWait(new Runnable() {
                public void run() {
                    if (JOptionPane.showConfirmDialog(null, "Start loading ?", "Confirm Load", JOptionPane.YES_NO_OPTION) == JOptionPane.YES_OPTION) {
                        answer = true;
                    }
                }
            });
            System.out.println("Answer = " + answer);
        }
        return null;
    }
}