我的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;
}
}
答案 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;
}
}