Autor Thema: [Java] Indetermined Progress Bar  (Gelesen 1410 mal)

0 Mitglieder und 1 Gast betrachten dieses Thema.

Offline Imion

  • Legend
  • *******
  • GURPShead
  • Beiträge: 4.863
  • Username: Imion
[Java] Indetermined Progress Bar
« am: 12.08.2007 | 23:49 »
Und wieder stehe ich vor einem Problem, das ich selbst mit den Sun-Tutorials und dem was ich sonst noch so im INet finde bisher nicht überwinden konnte.

Ich will eine indetermined Progress Bar einbauen, die ihr Werk verrichtet, sobald man einen Button betätigt.
Durch eben erwähnte Betätigung werden unter Anderem einige while-Schleifen in Gang gesetzt, die schon mal einige Zeit in Anspruch nehmen können.
Sobald die Berechnungen abgeschlossen sind, sollte auch die ProgressBar aufhören, ihren Weg von links nach rechts zu gehen.

Habe mir dass ungefähr wie folgt vorgestellt:

private void ButtonActionPerformed(java.awt.event.ActionEvent evt) {

ProgressBar.setIndetermined(true);   /*ab hier sieht man die ProgressBar "laufen" */
Button.setEnabled(false);

/*
*
* Hier wird berechnet
*
*/

ProgressBar.setIndetermined(false);   /*ab hier steht die ProgressBar wieder still */
Button.setEnabled(true);

}

Zwar wird in den Sun-Tutorials zum Thema der Umstand erwähnt, das man die Berechnungen im Hintergrund laufen lassen sollte, damit man auch merkt, dass die ProgressBar läuft, aber wie man das hinbekommen soll, habe ich leider nicht verstanden. Daher friert meine GUI ein, solange die Berechnungen durchgeführt werden, und nichts ist mit sichtbarem Progress.

Freue mich über jegliche Hilfe.

PS: Falls jemand weiss, wie man bei zu lange laufenden Berechnungen (also wenn die Geduld mal wieder nur in zu kleinen Mengen vorhanden ist) selbige per Button Abbrechen kann, würde ich mich auch in diesem Falle über einen Post freuen.
If the internet has shown us anything... anything... it has shown us that there is no such thing as "too batshit crazy to operate a computer."

Everybody's a book of blood. Wherever we're opened, we're red.

Außerirdische sind nicht rechtsfähige, bewegliche, herrenlose Sachen. Wer sie findet und mitnimmt darf sie behalten.

Offline avakar

  • Adventurer
  • ****
  • Gelegenheitsspieler
  • Beiträge: 818
  • Geschlecht: Männlich
  • Username: avakar
Re: [Java] Indetermined Progress Bar
« Antwort #1 am: 13.08.2007 | 08:44 »
Lies dir mal How to Use Progress Bars und
und den Beispielcode ProgessBarDemo.java dazu durch. Dort wird beispielhaft erläutert, wie du die von dir geforderte Aufgabe lösen kannst. Du brauchst dazu eine Progessbar und einen im Hintergrund laufenden Threads (SwingWorker), der die Berechnung durchführt. Mittels der ListenerInterfaces verbindest du die beiden Klassen und kannst so beide interagieren lassen.

Dieser im Hintergrund laufende Tread ist einfach eine (innere) Klasse (im Bsp. Task genannt), der in der Methode doRunInBackground() deine Berechnung durchführt. Gestartet wird der Task in actionPerformed(ActionEvent anEvent) mittels task.execute(). Genauso könntest du den Task in einem ActionListerners an einem anderen Buttons auch unterbrechen (task.cancel()). Du musst nur etwas aufpassen, dass bei einem Abbruch keine unvollständigen Berechnungen irgendwo gespeichert werden und so dein Datenzusatnd inkonsitent wird.

Offline Imion

  • Legend
  • *******
  • GURPShead
  • Beiträge: 4.863
  • Username: Imion
Re: [Java] Indetermined Progress Bar
« Antwort #2 am: 13.08.2007 | 13:24 »
Lies dir mal How to Use Progress Bars und
und den Beispielcode ProgessBarDemo.java dazu durch. (...)

Auf genau das Tutorial bin ich auch schon gestern gestossen, allerdings nicht schlau drauss geworden. Werde mir das Ganze in ruhiger Stunde nochmal zu Gemüte führen.
If the internet has shown us anything... anything... it has shown us that there is no such thing as "too batshit crazy to operate a computer."

Everybody's a book of blood. Wherever we're opened, we're red.

Außerirdische sind nicht rechtsfähige, bewegliche, herrenlose Sachen. Wer sie findet und mitnimmt darf sie behalten.

Darkwalker

  • Gast
Re: [Java] Indetermined Progress Bar
« Antwort #3 am: 14.09.2007 | 17:05 »
Mit dem Konstrukt

      javax.swing.SwingUtilities.invokeLater(new Runnable() {
        public void run() {

          <Hier Methode aufrufen>
        }
      });

kannst du aus SWING heraus eine GUI-Änderung oder Aktion so anstossen, das die anstossende Routine nicht auf ihn wartet. Ist unter SWING sehr wichtig da sonst die GUI hängt.

    SwingWorker worker = new SwingWorker() {

      public Object construct() {

        getMyDialog().getMyController().bearbeiteBefehle(aktOrder);
        return "Done";
      }

      public void finished() {

      }
    };

    worker.start();

ist die Alternative wenn du komplexere Rechenprozesse anstossen möchtest. Einfach mal nach SwingWorker auf java.sun.com suchen, da findest du die aktuelle Version (V3 oder so) des SwingWorkers.

Ach ja, als Bücher zu empfehlen sind von O'Reilley "JAVA Swing" sowie "Swing Hacks". Ersteres ist ein "Dumme Frager erschlagen" Werk, letzteres eine Sammlung von kurzen Tricks
« Letzte Änderung: 14.09.2007 | 17:08 von Darkwalker »