2012-02-07 2 views
1

У меня проблема с отображением индикатора выполнения при чтении файла на Java. Все работает по назначению, пользователь выбирает файл, программа должна показывать индикатор выполнения (но он загружает пустой пустой кадр), обрабатывает файл и затем загружает результаты в другое окно.JPanel не загружается в JFrame

Я не могу заставить программу отображать содержимое диалогового окна индикатора выполнения.
Небольшая помощь здесь была бы действительно оценена.

Вот код 3 используемых методов.

//this method reads the file 
public void processFile(File arch) {  
    aFile = arch; 
    Thread threadForSearch = new Thread() { 
    @Override 
    public void run() { 
     try{ 
     listaProveedoresTango = controladoraConsultas.traerProveedores(); 
     listaProveedoresAFIP = new LinkedList(); 
    BufferedReader data = new BufferedReader(new FileReader(aFile)); 
    String s; 
     while ((s = data.readLine()) != null) {     
    //long task     
     } 
     data.close(); 
    }catch (Exception e){ 
     System.err.println("Error: " + e.getMessage()); 
    } 
     } 
    }; 

    interfacesController.loadProgressBar(); 

    threadForSearch.start();   

    try { 
     threadForSearch.join(); 
    } catch (InterruptedException ex) { 
     Logger.getLogger(Controladora.class.getName()).log(Level.SEVERE, null, ex); 
    } 
    this.interfacesController.closeProgressBar(); 
    this.interfacesController.loadResults(someStuff);  
} 

//load a progress bar 
public void loadProgressBar(){   
    JProgressBar pb = new JProgressBar(0,100); 
    pb.setPreferredSize(new Dimension(175,20)); 
    pb.setString("Processing Data"); 
    pb.setStringPainted(true); 
    pb.setIndeterminate(true); 
    JLabel infoLabel = new JLabel("Reading File: "); 
    JButton cancelButton = new JButton("Cancel"); 
    cancelButton.addActionListener(new AbstractAction() { 
    @Override 
    public void actionPerformed(ActionEvent evt) { 
     exitSystem(); 
    } 
    }); 
    cancelButton.setVerticalAlignment(SwingConstants.CENTER); 
    JPanel center_panel = new JPanel(); 
    center_panel.add(infoLabel); 
    center_panel.add(pb); 
    center_panel.add(cancelButton); 
    center_panel.setLayout(new BoxLayout(center_panel,BoxLayout.Y_AXIS)); 
    dialog = new JDialog((JFrame)null, "Processing ..."); 
    dialog.getContentPane().add(center_panel, BorderLayout.CENTER); 
    dialog.setSize(100, 100); 
    dialog.setLocationRelativeTo(null); 
    dialog.pack(); 
    dialog.setVisible(true);   
} 

//close the open progress bar 
public void closeProgressBar(){ 
    this.dialog.dispose(); 
} 

решаемый с SwingWorker, я опубликовать обобщенный код:

public void processFile(File arch) { 

    aFile = arch; 

    final SwingWorker searchOnFile = new SwingWorker(){ 

     @Override 
     protected Object doInBackground() throws Exception { 
     try{ 
      BufferedReader data = new BufferedReader(new FileReader(aFile)); 
      String s; 
      while ((s = data.readLine()) != null) {     
       //long task     
      } 
      data.close(); 
     }catch (Exception e){ //Catch exception if any 
      System.err.println("Error: " + e.getMessage()); 
     } 
    interfacesController.closeProgressBar(); 
    interfacesController.loadResults(someStuff); 
    return null; 
    } 
    }; 

    interfacesController.showProgressBar(); 

    searchOnFile.execute(); 

} 

interfacesController содержит все методы для работы с ГПИ, showProgressBar() используется, чтобы показать бар и closeProgressBar() делать противоположный , Спасибо вам, ребята!

+0

1) У вас возникли вопросы? 2) Не блокируйте EDT, но выполняйте обновления GUI ** на ** EDT. НАПРИМЕР. используйте «SwingWorker» 3). Чтобы получить более эффективную помощь, опубликуйте [SSCCE] (http://sscce.org/). –

ответ

2

В дополнение к более полезному коду, я предлагаю использовать SwingWorker.

Абстрактный класс для выполнения длительных задач взаимодействия с графическим интерфейсом в фоновом потоке. Для выполнения таких задач можно использовать несколько фоновых потоков. ..

Учитывая характер задачи, вы также можете взглянуть на ProgressMonitorInputStream.

..создает монитор выполнения для отслеживания хода чтения входного потока. Если это займет некоторое время, появится сообщение ProgressDialog, чтобы сообщить пользователю. Если пользователь нажимает кнопку «Отмена», для следующего чтения будет выбрано InterruptedIOException. Вся правильная очистка выполняется, когда поток закрыт.

+1

Я слишком поздно, прямо +1 @Federico Matias Rodriguez, пожалуйста, прочитайте учебник о JProgressBar http://docs.oracle.com/javase/tutorial/uiswing/components/progress.html, – mKorbel

+0

Решенный с SwingWorker, спасибо! –

+0

Добро пожаловать. Рад, что вы его отсортировали. :) –