2016-04-06 11 views
1

Ich versuche, meine Fortschrittsleiste aus einer anderen Klasse zu setzen, aber fehlgeschlagen. Dies ist mein Fortschrittsbalken der Klasse Upload.Setze Progressbar von einer anderen Klasse

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

Ich habe eine andere Klasse namens Read. In dieser Klasse habe ich eine Schleife, die eine Datei lesen muss, also möchte ich den Fortschritt mit dem Iterator i von dieser Klasse festlegen. Ich weiß, dass ich das Minimum und maxium wie folgt festgelegt haben:

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

Und für den Wert:

progressBar.setValue(newValue); 

Wie kann ich den Wert für die progressbar gesetzt, so hält er den Wert von i Aktualisierung ?

+1

Um Ihre Aktualisierung der Fortschrittleiste beizubehalten, müssen Sie Ihre Datei in einem anderen (Nicht-Swing) Thread lesen. Der beste Weg ist SwingWorker zu verwenden. [Hier] (https://docs.oracle.com/javase/tutorial/uiswing/concurrency/) können Sie darüber lesen. –

+0

@SergiyMedvynskyy Ich bin nicht so weit fortgeschritten in Java, um das meiste zu verstehen. – Gintoki

+1

@Gintoki: 'SwingWorker' ist der einfache Weg. –

Antwort

0

Zunächst muss Ihre Reader-Klasse einen Verweis auf die betreffende Komponente (JProgressBar) haben. Ich verstehe, dass dies bereits gelöst ist.

Danach, zum Lesen einer Datei, empfehle ich dringend, eine Klasse zu verwenden, die javax.swing.SwingWorker erweitert. Dieses Muster ermöglicht es Ihnen, im Hintergrund zu arbeiten (kann für schwere Operationen wie das Lesen großer Dateien sein), ohne den AWT-Thread zu beeinflussen, so dass Ihre GUI nicht betroffen ist. Also sollte Ihr Leser javax.swing.SwingWorker verlängern.

Als kurze Zusammenfassung, stellt sie ein Verfahren namens doInBackground wo Sie sollten den ‚schweren‘ Betrieb implementieren und auch eine Methode namens process, wo es die Datenblöcke empfangen wird und Sie Ihre eigenen Berechnungen für den Fortschritt hinzufügen.

Die process Methode wird in AWT ausgeführt, so dass Sie jede Komponente der Benutzeroberfläche auf diese Weise aktualisieren können, um weitere Informationen

Benutzen Sie diese link (so einen guten Punkt, um Ihre Statusleiste zu aktualisieren).

0

Sie sollten SwingWorker dafür verwenden, wie in der JProgressBar documentation beschrieben.

Dieses SwingWorker ist ein Faden, an dem wir eine propertyChangeListener

Nach dem hinzufügen können wir firePropertyChange den Hörer aufrufen aufrufen können. Im Listener können wir den Fortschrittsbalken aktualisieren, indem wir setValue() darauf aufrufen.

Im Folgenden finden Sie ein Beispiel für das Lesen einer Datei und das Aktualisieren des Fortschrittsbalkens.

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

Ich musste String hinzufügen PROGRESS_PROPERTY_NAME = UploadGUI.PROGRESS_PROPERTY_NAME; oder es würde mir einen Fehler geben, weil die Variable nicht erkannt wird (UploadGUI ist die Klasse, in der der Balken ist). Die Leiste springt auch von 0 auf 100, wenn die Aufgabe erledigt ist, aber ich sehe% in der Konsole angezeigt. Hast du eine Idee, warum das so ist? – Gintoki

+0

Versuchen Sie, große Dateien zu erstellen, für kleine Dateien kann es zu schnell ausgeführt werden. – 11thdimension

+0

Ich habe es mit einem neuen Thread zu arbeiten – Gintoki

Verwandte Themen