2016-04-06 14 views
1

プログレスバーを別のクラスから設定しようとしましたが、失敗しました。これはプログレスバーのクラスUploadです。プログレスバーを別のクラスから設定する

JProgressBar progressBar = new JProgressBar(); 
progressBar.setBounds(91, 134, 284, 17); 
frame.getContentPane().add(progressBar); 

私は別のクラスReadを持っています。このクラスではファイルを読み込むループがあるので、そのクラスのイテレータiを使って進捗を設定したいと思います。

progressBar.setMinimum(0); 
progressBar.setMaximum(numRows); 

と価値のために:

それは iの値を更新し続けるので、私はプログレスバーの値を設定するにはどうすればよい
progressBar.setValue(newValue); 

私は、このような最小値とmaxiumを設定する必要があることを知っています?

+1

プログレスバーの更新を維持するには、別の(スイング以外の)スレッドでファイルを読み取る必要があります。 SwingWorkerを使用するのが最善の方法です。 [Here](https://docs.oracle.com/javase/tutorial/uiswing/concurrency/)を参照してください。 –

+0

@SergiyMedvynskyy私はそれを理解するためにJavaで進歩しているわけではありません。 – Gintoki

+1

@Gintoki:SwingWorkerは簡単な方法です。 –

答えて

0

まず、Readerクラスには、問題のコンポーネント(JProgressBar)への参照が必要です。私はこれがすでに解決されていることを理解しています。

その後、ファイルを読むために、javax.swing.SwingWorkerを拡張するクラスを使用することを強くお勧めします。このパターンを使用すると、AWTスレッドに影響を与えずにバックグラウンドで作業することができます(大きなファイルを読み込むなどの重い操作の場合もあります)ので、GUIには影響しません。だから、あなたの読者はjavax.swing.SwingWorkerに延長するべきです。

は、簡単な履歴書と、それはあなたが「重い」操作を実装する必要がありますdoInBackgroundと呼ばれる方法も、それはデータチャンクを受信するprocessと呼ばれる方法を提供し、あなたは進歩のために、独自の計算を追加します。あなたは、

してください(あなたのプログレスバーを更新するので、良い点)詳細については、このlinkを参照してください。この方法で任意のUIコンポーネントを更新できるように

process方法は、AWTで実行されます。

0

JProgressBar documentationの説明に従って、SwingWorkerを使用する必要があります。このSwingWorker

は、我々がリスナーを起動するためにfirePropertyChangeを呼び出すことができた後propertyChangeListener

を追加することができますどのスレッドです。リスナーでは、setValue()を呼び出してプログレスバーを更新できます。

以下は、ファイルを読み込んでプログレスバーを更新する作業例です。

import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import java.beans.PropertyChangeEvent; 
import java.beans.PropertyChangeListener; 
import java.io.IOException; 
import java.io.InputStream; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.nio.file.StandardOpenOption; 

import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JProgressBar; 
import javax.swing.SwingWorker; 

public class ProgressBar { 

    private static final String PROGRESS_PROPERTY_NAME = "progress"; 
    final static String fileName = "My_file_location"; 

    public static void main(String[] args) { 
     JFrame frame = new JFrame("Progress bar"); 
     JPanel panel = new JPanel(); 

     final JProgressBar progressBar = new JProgressBar(); 
     progressBar.setMinimum(0); 
     progressBar.setMaximum(100); 
     progressBar.setStringPainted(true); 

     panel.add(progressBar); 


     JButton button = new JButton("Start reading"); 
     button.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent e) { 
       ReadFiletask task = new ReadFiletask(fileName); 
       task.addPropertyChangeListener(
       new PropertyChangeListener() { 
        public void propertyChange(PropertyChangeEvent evt) { 

         if (PROGRESS_PROPERTY_NAME.equals(evt.getPropertyName())) { 
          progressBar.setValue((Integer)evt.getNewValue()); 
         } 
        } 
       }); 

       task.execute(); 
      } 
     }); 
     panel.add(button); 

     frame.add(panel); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     frame.setVisible(true); 
    } 

    public static class ReadFiletask extends SwingWorker<Boolean, Integer> { 
     String fileName; 
     public ReadFiletask (String fileName) { 
      this.fileName = fileName; 
     } 

     @Override 
     protected Boolean doInBackground() throws Exception { 
      System.out.println("Started reading"); 
      byte[] buffer = new byte[1024 * 1024];//1mb 
      InputStream is = null; 
      try { 
       Path file = Paths.get(fileName); 
       long fileSize = Files.size(file); 
       is = Files.newInputStream(file, StandardOpenOption.READ); 
       int readLen = -1; 
       int readCounter = 0; 
       while((readLen = is.read(buffer)) != -1) { 
        readCounter += readLen; 

        int percentDone = (int)((readCounter * 100.0)/fileSize); 
        System.out.println("done : " + percentDone); 

        /*Most important part is here */ 

        firePropertyChange(PROGRESS_PROPERTY_NAME, 0, percentDone); 
       } 

      } catch (IOException e1) { 
       e1.printStackTrace(); 
      } finally { 
       if(is != null) { 
        try { 
         is.close(); 
        } catch (IOException e1) { 
         e1.printStackTrace(); 
        } 
       } 
      } 
      System.out.println("Finished"); 
      return true; 
     } 

    } 
} 
+0

文字列PROGRESS_PROPERTY_NAME = UploadGUI.PROGRESS_PROPERTY_NAMEを追加する必要がありました。変数が認識されないのでエラーが出ます(UploadGUIはバーがあるクラスです)。タスクが完了すると、バーは0から100にジャンプしますが、%がコンソールに表示されています。なぜそれがあるのか​​考えていますか? – Gintoki

+0

大きなファイルを試してください。小さいファイルの場合、実行が速すぎる可能性があります。 – 11thdimension

+0

私は新しいスレッドで動作するようにしました – Gintoki

関連する問題