2013-12-06 4 views
0

В настоящее время у меня есть Java-программа с swing gui, которая позволяет пользователю выбирать различные файлы (xsl-fo и xml) и создает PDF-файлы с помощью Render X. Я пытаюсь на некоторое время получить поп-музыку чтобы JFrame отображался при нажатии кнопки, которая затем показывала индикатор выполнения или метку, чтобы информировать пользователя о ходе. Однако при создании нового фрейма он будет казаться черным или без компонентов, которые затем отображаются после завершения процессов.Показывать/обновлять компоненты до завершения процесса

private void RunButtonActionPerformed(java.awt.event.ActionEvent evt) { 

    ExecutorService executor = Executors.newFixedThreadPool(8); 

    //for reach file to process) 
    for (int i = 0; i < count; i++) { 
     Runnable worker = new ProcessThreader(conf, i); 
     executor.execute(worker); 
    } 

    executor.shutdown(); 
    JFrame PercentageFrame = new JFrame(); 
    PercentageFrame.setVisible(true); 
    PercentageFrame.setSize(200, 200); 
    PercentageFrame.repaint(); 

    while (!executor.isTerminated()) { 
     try { 
      Thread.sleep(1000); 
     } catch (InterruptedException ex) { 
      NarrowOptionPane.errorMessage("Interrupted: ", ex.getMessage()); 
     } 
    } 
    System.out.println("Complete"); 
} 

Кнопка запуска находится в JPanel, который расположен в JFrame и основная рама конкретизируется в главном методе и завернутый в Invoke позже метод

public static void main(String[] args) { 
    SwingUtilities.invokeLater(new Runnable() { 

     @Override 
     public void run() { 
      JFrame frame = new MainFrame("PDF Producer"); 
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
      frame.setVisible(true); 
      frame.setSize(710, 530); 
      frame.setResizable(false); 
      frame.setLocationRelativeTo(null); 
     } 
    }); 
} 

Я нахожусь довольно новый для потоки/исполнителей и java swing, так что легко! Спасибо

+0

удалить цикл while, он должен помочь вам, также обновите свой PercentageFrame из 'ProcessThreader'. – alex2410

ответ

2

Ваш while блок петли EDT, удалите это и ваш код будет работать.

Смотреть следующий пример с ExecutorService и JProgressBar:

import java.awt.BorderLayout; 
import java.util.concurrent.ExecutorService; 
import java.util.concurrent.Executors; 

import javax.swing.JFrame; 
import javax.swing.JProgressBar; 

public class Example extends JFrame { 

    private static JProgressBar progress; 

    public static void main(String[] args) { 
     final JFrame f = new JFrame(); 
     progress = new JProgressBar(); 
     progress.setStringPainted(true); 
     progress.setIndeterminate(true); 
     ExecutorService newCachedThreadPool = Executors.newFixedThreadPool(1); 
     for(int i =0; i<10;i++){ 
      final int j = i; 
      Runnable r = new Runnable() { 

       @Override 
       public void run() { 
        progress.setString(j+""); 
        try { 
         Thread.sleep(1000); 
        } catch (InterruptedException e) { 
         e.printStackTrace(); 
        } 
       } 
      }; 
      newCachedThreadPool.submit(r); 
     } 
     f.getContentPane().add(progress,BorderLayout.CENTER); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.pack(); 
     f.setVisible(true); 
    } 

} 

Здесь JFrame показать количество Runnable, которое выполняется в ExecutorService. Также, если вам нужно получить результат из ваших Runnables, попробуйте использовать Callable вместо Runnable. С этим, когда вы submitCallable вы получаете Future экземпляр, из которого вы можете получить результат.

Подробнее о Executors, Callable и Future.

+0

Для справки «SwingWorker» реализует «Runnable», «Future » и «RunnableFuture ». – trashgod

3

Код, выполненный из прослушивателя, выполнен в Thread Dispatch Thread. Таким образом, Thread.sleep() заставляет EDT спать, что означает, что GUI не может реагировать на события или перерисовывать себя.

Для получения дополнительной информации ознакомьтесь с разделом из учебника Swing по телефону Concurrency In Swing. Одним из решений, описанным в этом учебном пособии, является использование SwingWorker для долговременной задачи и публикация результатов по мере их появления.

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