Set Progressbar von einer anderen Klasse

Ich versuche mit meiner progressbar von einer anderen Klasse aber nicht. Dies ist meine progressbar-Klasse Upload.

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

Habe ich noch eine Klasse namens Read. In dieser Klasse habe ich eine Schleife, die braucht zum Lesen einer Datei, so möchte ich den Fortgang mit dem iterator i von dieser Klasse. Ich weiß, dass ich habe, um die minimale und maximale wie diese:

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

Und für den Wert:

progressBar.setValue(newValue);

Wie kann ich den Wert für die progressbar, also es hält die Aktualisierung des Werts i?

  • Um Ihre progressbar-Aktualisierung, die Sie brauchen, um Lesen Sie Ihre Datei in einem anderen (nicht-Swing-thread). Beste Weg ist die Verwendung von SwingWorker. Hier, die man nachlesen kann.
  • Ich bin nicht so weit in Java zu verstehen die meisten es.
  • SwingWorker ist der einfache Weg.
InformationsquelleAutor Gintoki | 2016-04-06



2 Replies
  1. 0

    Zuerst, Ihre Leser-Klasse muss eine Referenz auf die Komponente (JProgressBar) in Frage. Ich verstehe, dass dies ist bereits gelöst.

    Danach, für das Lesen einer Datei, die ich empfehlen die Verwendung einer Klasse, die sich javax.swing.SwingWorker. Dieses Muster ermöglicht das arbeiten im hintergrund (kann für schwere Operationen wie das Lesen von großen Dateien), ohne die der AWT-thread, also deine GUI nicht betroffen. So, Ihr Leser sollte verlängern javax.swing.SwingWorker.

    Als einen kurzen Lebenslauf, bietet es eine Methode namens doInBackground wo Sie implementieren sollten, die „schweren“ Betrieb und auch eine Methode namens process wo es empfangen wird, die Daten-chunks und fügen Sie Ihre eigenen Berechnungen für den Fortschritt.

    Den process Methode ist ausgeführt im AWT, so können Sie aktualisieren Sie jede UI-Komponente an dieser Methode (also ein guter Zeitpunkt zu aktualisieren Sie Ihre Fortschritte bar)

    Bitte beziehen Sie sich auf diese link für weitere Informationen.

  2. 0

    Sollten Sie verwenden SwingWorker für es wie beschrieben in der JProgressBar-Dokumentation.

    Diese SwingWorker ist ein thread, auf dem wir können hinzufügen, ein propertyChangeListener

    Nachdem die wir anrufen können firePropertyChange, rufen die Zuhörer. In den listener-wir aktualisieren können Sie die Statusanzeige durch den Aufruf setValue() drauf.

    Folgenden ist ein Beispiel für das Lesen einer Datei und aktualisiert den Fortschrittsbalken.

    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;
            }
    
        }
    }
    • Ich hatte, um String PROGRESS_PROPERTY_NAME = UploadGUI.PROGRESS_PROPERTY_NAME; oder es würde mir eine Fehlermeldung, da die variable wird nicht erkannt(UploadGUI die Klasse, wo die bar ist). Die bar springt von 0 auf 100, wenn die Aufgabe erledigt ist, aber ich sehe die % angezeigt in der Konsole. Haben Sie eine Idee, warum das so ist?
    • Versuchen Sie bei großen Dateien, bei kleinen Dateien kann es laufen viel zu schnell.
    • Es sollte gearbeitet haben, mit dem SwingWorker auch, wie es das Runnable-Instanz kann es direkt weitergegeben werden, um einen Thread. Swing ist nur, dass einige Dinge einfacher für uns.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.