2015-08-18 3 views
0

My SwingWorker doInBackground считывает несколько файлов Excel и выполняет длительные вычисления. У файлов есть имена и местоположения по умолчанию, но когда файл по умолчанию не найден, мне нужно открыть диалоговое окно «Открыть файл» и подождать, пока пользователь не выберет заменяющий файл.
Я попытался использовать publish(), и мой диалог Open .. выглядит красиво, но doInBackground продолжает выполнение и не ждет. Как я могу это сделать?java - Как вызвать JFileChooser изнутри SwingWorker 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

Обычно вы используете 'SwingUtilities.invokeAndWait()'. Не уверен, имеет ли 'SwingWorker.doInBackground()' некоторое ограничение на использование этого метода. – vanza

ответ

0

Почему нет boolean, который хранит ли JFileChooser сделано, и в doInBackground() вызова wait() в while цикле с его состоянием, как boolean. Когда ваш JFileChooser будет выполнен, установите boolean на номер true и позвоните по номеру notifyAll().

2

Короткий ответ: нет. Это будет нарушать правила одиночного потока Swing. Вместо этого собирайте List файлов перед раздачей, запрашивая пользователя по мере необходимости; как только у вас есть файлы List, просто передайте его SwingWorker.

SwingWorker должен сосредоточиться только на обработке файлов, что-то еще должно генерировать исключение.

+0

К сожалению, я не могу создать такой «Список», потому что результаты вычислений определяют, какие файлы следует читать дальше, так что здесь не вариант ... – user3167027

+0

Затем вам нужно связать каждый результат с другим SwingWorker, используя либо PropertyChangeListener, либо выполненный метод определить, когда рабочий завершен – MadProgrammer

Смежные вопросы