Progress Bar- wie richtig darstellen, verstehe es nicht

Myar

Mitglied
Hallöchen!

In meiner GUI Klasse habe ich folgenden Code:

Code:
public void actionPerformed(ActionEvent e) {
        jButton7.setEnabled(false);
        setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
        task = new Task();
        task.addPropertyChangeListener(this);
        task.execute();

    }
    
    public void propertyChange(PropertyChangeEvent evt) {
        int progress = task.getProgress();
        if (progress == 0) {
            progressBar.setIndeterminate(true);
        } else {
            progressBar.setIndeterminate(false);
        }
    }
    
    class Task extends SwingWorker<Void, Void> {
        @Override
        public Void doInBackground() {
            
           //Und während diese Klasse ihr Ding macht, müsste sich die ProgressBar füllen. Is das überhaupt möglich?
            pruefvorgang start = new pruefvorgang(jTable4, jComboBox5, jLabel15, jRadioButton10, jLabel33);
            start.pruefstart();
            
            return null;
        }
        
        @Override
        public void done() {
            Toolkit.getDefaultToolkit().beep();
            jButton7.setEnabled(true);
        }
    }

Wer aufgepasst hat, merkt, dass dies aus dem Sun Tutorial kopiert ist. Da wo der Kommentar steht, ist halt von mir abgeändert und da liegt mein Problem.
Bisher wurde immer die Bar in irgendwelchen Schleifen befüllt, aber ich will ja die Methode nicht so oft ausführen und überhaupt verstehe ich das Vorgehen dieser sache noch nicht.
Kann mir wer sagen, wie ich dafür sorgen kann, dass die ProgressBar sich halt so lange füllt, wie die Methode die da aufgerufen wird läuft und wenn die fertig ist, ist halt 100%?

Und wenn ich nun zu dumm bin und da was völlig falsches verlange, sagt das ruhig ;)

Gruß
Myar
 
Weißt du denn zu jedem Zeitpunkt wie weit dein Vorgang forgeschritten ist?

Dann kannst du in deinem SwingWorker mit setProgress den Fortschritt setzen. Über den propertyChange kannst du das entsprechend an die ProgressBar weitergeben. Diese also auf indeterminate(false) setzen und ebenfalls mit setProgress arbeiten.
 
Hallo!

Naja, die Klasse die da aufgerufen wird und dann die Methode daraus, holt halt Daten aus einer DB und einer datei, vergleicht die und übergibt dann die Abweichungen der Tabelle, die dann ein neues Modell mit diesen Daten bekommt.
Das passiert halt in einer seperaten Klasse.
Da muss ich eine weitere Unwissenheit kund tun, denn ich kann mir gerade nicht denken, wie ich den Fortschritt innerhalb dieser Klasse rausbekomme.
Wahrscheinlich sit es was ganz einfaches :rolleyes:
 
Am Besten auch über einen Listener (http://openbook.galileocomputing.de...07_002.htm#mjc458ffc1fe54314d499d80dc79a2d80d).

Wenn du weißt, dass du 10 Sachen prüfen musst, dann kannst du ja nach jedem Schritt eine aktualisierte Prozentzahl bereitstellen.

Ich würde dir empfehlen an deine Klasse pruefvorgang (Klassen übrigens immer Groß schreiben!) keine GUI-Elemente sondern nur die aus den GUI-Elementen benötigten Daten zu übergeben. Schau, dass du immer Oberfläche und Funktioanlität möglichst gut trennst. Dann kannst du GUI und Backend einigermaßen unabhängig voneinander verändern.
 
Hallo und danke für die Antwort!

Nachdem ich mir mit diesem Listener einen abgebrochen habe, habe ich es nun doch so gelöst, dass die ProgressBar einfach auf "setIndeterminate" gesetzt wird und wenn die Prüfroutine fertig sit, wieder stillgelegt. damit sieht der Bentzer wenigstens, dass überhaupt was passiert, da im besten fall (also keine Abweichugnen) nichts angezeigt wird. So weiß mann wenigstens, dass alles okay ist :)

Nochmals danke für die Hilfe!

Gruß
Myar
 
Listener sind wirklich einfach. Eigentlich ist es wichtig das Prinzip einmal zu verstehen, weil man sowas in Oberflächen andauernd braucht. Wenn es an der einen oder anderen Stelle hakt kannst du einfach deinen von dir erarbeiteten Code hier posten, dann können wir nochmal draufschauen was das Problem ist und dir Tipps geben.
 
Falls du versuchst Listener zu verstehen, hilft es ziemlich, mal selber einen zu schreiben, denn wenn's mal klick gemacht hat, wirst du das nacher dauernd machen wollen, weil sich mit Listenern Dinge ganz einfach lösen lassen, um die man ohne Listener eine ganze Codeburg bauen müsste.
Falls dir der obige Artikel zu abstrakt ist, würd ich dir diesen Artikel empfehlen, der das ganze anhand eines simplen Beispiels Schritt für Schritt erklärt. Ist allerdings auf englisch, aber das ist man sich ja gewöhnt ;)

Gruss
.bile
 
Zurück