1

在 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 包含所有使用 GUI 的方法,showProgressBar() 用于显示栏,而 closeProgressBar() 则相反。感谢你们!

4

1 回答 1

2

缺少更有用的代码,我建议使用SwingWorker.

在后台线程中执行冗长的 GUI 交互任务的抽象类。可以使用多个后台线程来执行此类任务。..

鉴于任务的性质,您还可以查看ProgressMonitorInputStream.

..创建一个进度监视器来监视读取输入流的进度。如果需要一段时间,会弹出一个 ProgressDialog 来通知用户。如果用户点击 Cancel 按钮,则会在下一次读取时抛出 InterruptedIOException。当流关闭时,所有正确的清理工作都完成了。

于 2012-02-07T12:30:41.837 回答