2013-02-26 5 views
2

Я пишу код с использованием Java Swing. В основном, это то, что он обрабатывает некоторую длительную задачу. Во время выполнения задачи я хочу получить всплывающее окно ожидания с изображением GIF.Запуск потока пользовательского интерфейса неопределенно

Мой вопрос заключается в том, что

 final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName()); 

     final File finalFileToBeUploaded = fileToBeUploaded; 

     class FileParsingWorker extends SwingWorker<Void, String> {    
      @Override 
      protected Void doInBackground() throws Exception { 
       String text = fileParsers.parseFile(finalFileToBeUploaded); 
       publish(text); 
       return null; 
      } 

      @Override 
      protected void process(List<String> chunks) { 
       infoDialog.setVisible(false); 
      } 
     } 

     infoDialog.setVisible(true); 
     FileParsingWorker fileParsingWorker = new FileParsingWorker(); 
     fileParsingWorker.execute(); 

InfoDialog является небольшой UI всплывающее окно с GIF-анимации в нем. В основном, я задал длительную задачу у рабочего, но набор пользовательских интерфейсов в двух местах. Я думаю, если есть какие-то способы, которыми я могу запустить интерфейс InfoDialog в потоке, чтобы я мог повторно использовать этот бит кода?

Проблема заключается в том, что я хочу попытаться запустить InfoDialog бесконечно, пока я намеренно не остановлю его. Если я поставлю setVisible (true) в потоке, этот поток немедленно прекратится, и мой пользовательский интерфейс не будет обновлен.

Может ли кто-нибудь показать мне, как это сделать?

+0

Где вы устанавливаете диалог на видимый? – MadProgrammer

ответ

3

Просьба ознакомиться с Concurrency in Swing конкретно The Event Dispatch Thread. Это поток, на котором все компоненты Swing должны создаваться и обрабатываться. то есть:

SwingUtilities.invokeLater(new Runnable() { 
    @Override 
    public void run() { 
     final InfoDialog infoDialog = new InfoDialog("Parsing file: " + fileToBeUploaded.getName()); 

     final File finalFileToBeUploaded = fileToBeUploaded; 

     ... 

     infoDialog.setVisible(true); 
     FileParsingWorker fileParsingWorker = new FileParsingWorker(); 
     fileParsingWorker.execute(); 
    } 
}); 

Кроме того, я думаю, еще одна проблема заключается в установке dialog назад к невидимым в перекрываться process(List<String> chunks) качелей работника, таким образом, как первая порция читать dialog будет закрыт. Я думаю, что Swing Workers done() может быть больше того, что вы хотите, и его выполнение на EDT:

class FileParsingWorker extends SwingWorker<Void, String> {    
    @Override 
    protected Void doInBackground() throws Exception { 
     String text = fileParsers.parseFile(finalFileToBeUploaded); 
     publish(text); 
     return null; 
    } 

    @Override 
    protected void process(List<String> chunks) { 
     //each chunk will get processed here 
    } 

    @Override 
    protected void done() {//when Swing worker is finished this method is called 
     infoDialog.setVisible(false); 
    } 
} 
+1

+1 - просто nitpicking: до тех пор, пока публикация вызывается только один раз, это не имеет большого значения :-) – kleopatra

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