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がポップアップ表示されてユーザーに通知されます。ユーザーが[キャンセル]ボタンを押すと、次の読み取り時にInterruptedIOExceptionがスローされます。ストリームが閉じられると、すべての適切なクリーンアップが実行されます。

于 2012-02-07T12:30:41.837 に答える