JPanel не загружается в JFrame - PullRequest
1 голос
/ 07 февраля 2012

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

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

Вот код из 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 () выполняет противоположное действие.Спасибо, ребята!

1 Ответ

2 голосов
/ 07 февраля 2012

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

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

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

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

...