Anzeige einer Progressbar.

Status
Nicht offen für weitere Antworten.

Sky

Top Contributor
Ich weiss, das dieses Thema hier schon mehr als einmal behandelt wurde. Ich habe auch die letzten Tage ziemlich viele Beiträge zu dem Thema gelesen, komme aber trotzdem nicht so recht weiter.

Also, zu meinem Problem: Ich habe ein Applet welches per Button-Klick Daten vom Server holen soll. Dies kann sehr lange dauern. Aus diesem Grund will ich in der Zwischenzeit eine Progressbar anzeigen. Ich weiss, dass ich dazu mehrere Threads brauche. Mein Problem ist nun, dass die Progressbar erst dann angezeigt wird, wenn mein Request fertig abgearbeitet ist! Das Fenster, in dem sich die Progressbar befindet wird zwar sofort gemalt, ist aber 'leer'. Sobald dann der Request abgearbeitet ist, fängt dann an die Progressbar loszulaufen.

Hier ein paar Code-Fragmente:

Code:
public static RequestError sendRequest( RequestObject oRequestObject ) {
  RequestProgressBar x = new RequestProgressBar();
  x.setVisible(true);
  x.start();
  RequestError oError = sendRequest(oRequestObject); // Erst nach dieser Anweisung erfolgt die Anzeige!
  return oError;
}

Der folgende Code ist aus dem Thread hier übernommen & leicht angepaßt.

Code:
import java.lang.reflect.InvocationTargetException;

import java.awt.*;
import javax.swing.*;

public class RequestProgressBar extends JFrame implements Runnable {
   /** Der Algorithmus, der ausgeführt werden soll */
   private Algorithmus algorithmus;

   /** Der Fortschrittsbalken */
   private JProgressBar progress;

   /**
    * Standartkonstruktor, stellt ein neues Fenster her.
    */
   public RequestProgressBar(){
      progress = new JProgressBar();
      algorithmus = new Algorithmus(); // Wir brauchen ja einen Algorithmus ;-)

      // Der folgende Teil ist nur für das Auge, eine Benutzeroberfläche die
      // etwas dynamisch ist, kommt immer gut an.
      Container content = getContentPane();
      content.setLayout( new GridBagLayout() );

      JPanel panel = new JPanel( new GridLayout( 1, 2 ));

      content.add( progress, new GridBagConstraints( 0, 0, 1, 1, 1.0, 1.0,
            GridBagConstraints.CENTER, GridBagConstraints.HORIZONTAL,
            new Insets( 2, 2, 2, 2 ), 0, 0) );

      content.add( panel, new GridBagConstraints( 0, 1, 1, 1, 1.0, 1.0,
            GridBagConstraints.SOUTHEAST, GridBagConstraints.NONE,
            new Insets( 2, 2, 2, 2 ), 0, 0) );

      // Geeignete Grösse und Position wählen
      pack();

      setDefaultCloseOperation( EXIT_ON_CLOSE );
   }

   /**
    * Startet den Algorithmus, das Verhalten ist nicht definiert, wenn der
    * Algorithmus bereits aktiviert wurde.
    */
   protected void start(){
      // Einen neuen Thread herstellen, und starten.
      new Thread( this ).start();
   }

   /**
    * Stoppt den Algorithmus, immer unter der Annahme, dass er zurzeit
    * läuft.
    */
   protected void stop(){
      algorithmus.setInterrupted( true );
   }

   /**
    * Die Methode wird aus einem Zusatzthread aufgerufen. Sie startet
    * den Algorithmus, und sorgt nach seiner Beendigung dafür, dass das
    * Fenster weiterhin schön aussieht
    */
   public void run(){
      // Zurzeit ist der Algorithmus nicht unterbrochen
      algorithmus.setInterrupted( false );

      // Den Algorithmus starten. Die Methode kehrt erst zurück, wenn der
      // Algo abgearbeitet oder unterbrochen wurde.
      algorithmus.run( progress );

      if( algorithmus.isInterrupted() ){
         /*
          * Sollte der Algorithmus abgebrochen worden sein, wird die
          * Progressbar zurück auf den Startwert gesetzt.
          *
          * Die Methode "invokeLater" garantiert, dass dass der Code des
          * übergebenen Runnable's synchronisiert zum Dispatch-Thread
          * ausgeführt wird. Dies ist notwendig, weil Swing nicht
          * threadsicher ist.
          */
         SwingUtilities.invokeLater( new Runnable(){
            public void run(){
               progress.setMinimum( 0 );
               progress.setMaximum( 1 );
               progress.setValue( 0 );
            }
         });
      }
      else{
         /*
          * Der Algorithmus wurde korrekt beendet, ein Dialog soll den
          * Benutzer unterrichten, dass das Programm nun geschlossen wird.
          *
          * Die Methode "invokeAndWait" garantiert, dass der Code des
          * Runnable-Objektes, welches übergeben wird, synchron zum
          * Dispath-Thread ausgeführt wird. Ausserdem kehrt die Methode
          * erst dann zurück, wenn eben dieser Code ausgeführt wurde.
          */
         try {
            SwingUtilities.invokeAndWait( new Runnable(){
               public void run(){
                  JOptionPane.showMessageDialog( RequestProgressBar.this,
                        "Algorithmus erfolgreich beendet.", "Beendet",
                        JOptionPane.INFORMATION_MESSAGE );
               }
            });
         } catch (InterruptedException e) {
            // Kann ja sein, das hier was schiefgeht...
            e.printStackTrace();
         } catch (InvocationTargetException e) {
            e.printStackTrace();
         }

      }
   }

   class Algorithmus {
      /**
       * Dieser Fortschrittsbalken wird benutzt, um den Fortschritt des Algos
       * anzuzeigen
       */
      private JProgressBar status;

      /**
       * Dieser Boolean wird auf "true" gesetzt, sollte der Algorithmus abgebrochen
       * werden.
       */
      private boolean interrupted = false;

      public Algorithmus(){
      }

      /**
       * Gibt an, ob der Algorithmus abgebrochen wird, oder wurde.
       * @return true, falls der Algorithmus stoppen soll
       */
      public boolean isInterrupted(){
         return interrupted;
      }

      /**
       * Gibt an, ob der Algorithmus abgebrochen werden soll.
       * @param interrupt true, falls der Algorithmus abgebrochen werden soll,
       * andernfalls false.
       */
      public void setInterrupted( boolean interrupt ){
         interrupted = interrupt;
      }

      /**
       * Die Hauptmethode des Algorithmuses, hier geschehen alle wichtigen
       * Berechnungen. Leider konnte die Weltformel hier nicht Platz finden,
       * deshalb beschränkt sich die Methode auf stupides hochzählen eines
       * Integers :-)
       * @param progress Der Fortschrittsbalken, welcher den Fortschritt
       * des Algos anzeigen wird.
       */
      public void run( JProgressBar progress ) {
         // Den Fortschrittsbalken speichern wir als Instanzvariable. Das
         // hat den Vorteil, dass jede der 1000 Methoden des Algos Zugriff
         // auf die Progressbar hat.
         status = progress;

         int begin = 13;
         int end = 65;
         int current = begin;

         // Minimum und Maximum des Fortschrittbalkens setzen
         setMinMax( begin, end );

         while( current <= end && !isInterrupted() ){
            try {
               Thread.sleep( 100 );  // Kurz warten
            } catch (InterruptedException e) {}
            setValue( current++ ); // Hey! Es ist was passiert!
         }

         // Instanzvariable auf null setzen, damit der Garbagecollector
         // allenfalls Müll entfernen kann
         status = null;
      }

      /**
       * Setzt die minimalen und die maximalen Werte des Fortschrittbalkens. Die
       * Methode kehrt erst zurück, wenn die Werte tatsächlich gesetzt wurden.
       * @param min Das Minimum
       * @param max Das Maximum
       */
      private void setMinMax( final int min, final int max ){
         try {
            /*
             * Diese Methode wird nicht aus dem Dispatcher-Thread aufgerufen.
             * Da Swing nicht threadsicher ist, müssen wir für eine
             * Synchronisation sorgen, deshalb wird hier "invokeAndWait" verwendet.
             */
            SwingUtilities.invokeAndWait( new Runnable(){
               public void run() {
                  status.setMinimum( min );
                  status.setValue( min );
                  status.setMaximum( max );
               }
            });
         } catch (Exception e) {}
      }

      private void setValue( final int value ){
           /*
            * Der Algorithmus sollte nicht unnötig angehalten werden, nur damit die
            * Progressbar schön aussieht, deshalb "invokeLater".
            * Es kann nun aber passieren, dass der Algorithmus abbricht, nachdem
            * er "setValue" aufgerufen hat (und damit die Variable "status" auf
            * null setzt), das übergebene Runnable aber erst später ausgeführt wird.
            * Aus diesem Grund wird ein try-catch-Block benutzt, der die mögliche
            * NullPointerException abfängt. Alternativ könnte man mit dem Keyword
            * "synchronized" einen Mechanismus bauen, der verhindert dass die Variable
            * "status" verändert wird, während wir uns in dieser Methode befinden
            * (und dann eine einfache if-Abfrage machen).
            */
      SwingUtilities.invokeLater( new Runnable(){
         public void run() {
            try{
               status.setValue( value );
            }
            catch( NullPointerException ex ){
               // silent exception
            }
         }
         });
      }
   }

}
 
B

Beni

Gast
Dieses "sendRequest" sollte in einem anderen Thread, als der GUI-Thread, ablaufen.

Der Beispielcode ist so gedacht, dass du das "sendRequest" in die Methode "run" von "Algorithmus" steckst.
Wie weit der Fortschrittsbalken wandert, musst du selbst festlegen (das müsste sendRequest berechnen). Da das wohl nicht so gut möglich ist, setzt doch die ProgressBar auf "setIndeterminate(true)", dann wandert sie einfach hin und her.
 

Sky

Top Contributor
Ok, war'n kleiner Denkfehler von mir. Hab' das jetzt so umgebaut, wie Du's beschrieben hast, laufen tut's aber trotzdem wie vorher :-(
 

Sky

Top Contributor
Ok, ich will euch meine Lösung nicht vorenthalten: ich mußte nach jeder Aktualisierung der ProgressBar ein "paintImmediately" aufrufen. Dann gehts... warum auch immer!? (Ist eigentlich auch egal...)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Komponente zur Anzeige einer Textdatei. AWT, Swing, JavaFX & SWT 10
hannibalstgt Fehler bei JCOMBOBOX GUI Anzeige AWT, Swing, JavaFX & SWT 4
M suche geeignetes Fenster zur Anzeige AWT, Swing, JavaFX & SWT 49
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
S AffineTranformation Bilder verschwinden von Anzeige bei Pan, Zoom AWT, Swing, JavaFX & SWT 6
kodela Swing Anzeige des Warten-Cursors AWT, Swing, JavaFX & SWT 8
kodela Verspätete Anzeige in Textfeldern AWT, Swing, JavaFX & SWT 8
F BorderLayout Hilfe bei Anzeige AWT, Swing, JavaFX & SWT 2
L Java FX Keine Anzeige Im Tableview AWT, Swing, JavaFX & SWT 4
F JScrollPane anzeige AWT, Swing, JavaFX & SWT 7
F Design-Anzeige im Windowbuilder AWT, Swing, JavaFX & SWT 3
thet1983 JavaFX TableView Objekt Daten anzeige AWT, Swing, JavaFX & SWT 2
D JavaFX Control zur Anzeige von eBooks AWT, Swing, JavaFX & SWT 5
javampir Swing Anzeige der FileFilter im JFileChooser AWT, Swing, JavaFX & SWT 0
T Probleme mit Anzeige von Elementen im JPanel AWT, Swing, JavaFX & SWT 1
J JavaFX JavaFX Probleme bei der Anzeige von Text AWT, Swing, JavaFX & SWT 18
G JScrollPane bricht am Ende der Anzeige nicht um AWT, Swing, JavaFX & SWT 2
V JWindow: Falsche Anzeige auf Ubuntu AWT, Swing, JavaFX & SWT 2
N JDialog als Progress-Anzeige AWT, Swing, JavaFX & SWT 6
M AWT Gui anzeige Probes - Elemente erscheinen nicht regelmäßig AWT, Swing, JavaFX & SWT 2
A JFreeChart BarChart invertierte anzeige oder werte bereich von-bis AWT, Swing, JavaFX & SWT 4
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
P Swing Problem mit der Anzeige AWT, Swing, JavaFX & SWT 12
B SWT TreeViewer dynamische Anzeige von Icons AWT, Swing, JavaFX & SWT 3
M Anzeige updatet sich erst am Ende des Programms AWT, Swing, JavaFX & SWT 3
J JList, Anzeige aktualisieren AWT, Swing, JavaFX & SWT 7
J Kleines Anzeige Problem(nur blanker Frame) AWT, Swing, JavaFX & SWT 22
A Swing JFileChooser - Anzeige in Echtzeit filtern AWT, Swing, JavaFX & SWT 10
N Swing JTextPane zur Anzeige von HTML AWT, Swing, JavaFX & SWT 2
A Swing Anzeige Text in JScrollpane AWT, Swing, JavaFX & SWT 8
M TabbpedPane Anzeige aktualisieren AWT, Swing, JavaFX & SWT 6
S Anzeige von Beschleunigungswerten AWT, Swing, JavaFX & SWT 2
S Anzeige eines JWindows AWT, Swing, JavaFX & SWT 3
N jcomboBox anderer Wert als Anzeige AWT, Swing, JavaFX & SWT 6
B Swing Java crashed nach Anzeige JOptionePane AWT, Swing, JavaFX & SWT 20
S Probleme mit Anzeige von JComboBox AWT, Swing, JavaFX & SWT 2
J Anzeige AWT, Swing, JavaFX & SWT 5
F Verzögerung bei der ersten Anzeige AWT, Swing, JavaFX & SWT 6
timbeau Gitter in Sudoko-Anzeige AWT, Swing, JavaFX & SWT 9
J Swing JTable, eigener TableCellRenderer Keine Anzeige in den Zellen AWT, Swing, JavaFX & SWT 8
D Swing Anzeige während eines Ladevorganges AWT, Swing, JavaFX & SWT 6
N Eigener Grafik Editor mit fehlerhafter Anzeige AWT, Swing, JavaFX & SWT 4
C SWT SWT Browser anzeige bug AWT, Swing, JavaFX & SWT 3
A Einschreiten vor anzeige eines Frames AWT, Swing, JavaFX & SWT 26
P JTree - Explorer mit nur eingeschränkter Anzeige AWT, Swing, JavaFX & SWT 17
J Verzögerung bei Änderungen der Anzeige abwarten AWT, Swing, JavaFX & SWT 5
T SWT Keine Anzeige der Widgets nach Comboauswahl AWT, Swing, JavaFX & SWT 2
M.F.G. Fehler bei der Anzeige Grafischer Elemente AWT, Swing, JavaFX & SWT 13
B SWT Textdatei Lesen und Anzeige in View - Zeichensatzproblem AWT, Swing, JavaFX & SWT 4
hdi JTree: interne Daten OK, Anzeige schwarze Magie AWT, Swing, JavaFX & SWT 2
R Anzeige der Aktivität AWT, Swing, JavaFX & SWT 3
S Splash Screen / "Loading" Anzeige im Programm AWT, Swing, JavaFX & SWT 27
S JTree - Anzeige des Knotennamen ändern AWT, Swing, JavaFX & SWT 2
B JList Anzeige aktualisieren (Models) AWT, Swing, JavaFX & SWT 2
G Keine Anzeige des Balkens AWT, Swing, JavaFX & SWT 3
C JTable aktualisiert die Anzeige nicht AWT, Swing, JavaFX & SWT 2
G Anzeige schwierigkeiten AWT, Swing, JavaFX & SWT 3
G Problem mit Anzeige von HTML AWT, Swing, JavaFX & SWT 5
P JRE 6 -> ToolTip & mnemonic Anzeige AWT, Swing, JavaFX & SWT 4
G JComboBox - Anzeige mit Wert verknüpfen AWT, Swing, JavaFX & SWT 3
G Anzeige Problem AWT, Swing, JavaFX & SWT 4
D Anzeige eines Bildes: JPanel oder JLabel ? AWT, Swing, JavaFX & SWT 3
T dynamische anzeige? AWT, Swing, JavaFX & SWT 4
W JList Anzeige erneuern AWT, Swing, JavaFX & SWT 4
P JMenuBar und JToolBar Anzeige Probleme AWT, Swing, JavaFX & SWT 5
T JComboBox anzeige AWT, Swing, JavaFX & SWT 6
F Anzeige von JPanel AWT, Swing, JavaFX & SWT 3
M JTree und Anzeige des entsprechenden Panels AWT, Swing, JavaFX & SWT 5
K Probleme mit der Anzeige eines einzigen Nodes in einem JTree AWT, Swing, JavaFX & SWT 9
S SWT-Widgets für Anzeige-Elemente AWT, Swing, JavaFX & SWT 3
G Keine Anzeige von Grafik bei externem paintComponent-Aufruf AWT, Swing, JavaFX & SWT 2
M GUI mit Swing erst nach Maximieren richtige Anzeige AWT, Swing, JavaFX & SWT 2
S Anzeige der Benutzeroberfläche verzögern AWT, Swing, JavaFX & SWT 10
G Anzeige von JTextField erneuern AWT, Swing, JavaFX & SWT 12
P DefaultTreeCellEditor -> Anzeige Probleme AWT, Swing, JavaFX & SWT 3
swek Flackernde Anzeige AWT, Swing, JavaFX & SWT 4
C Schweres Problem mit JDialog und Threads! Anzeige blockiert! AWT, Swing, JavaFX & SWT 5
A JTree-Anzeige filtern AWT, Swing, JavaFX & SWT 7
R Anfängerfrage:anzeige von Gui elementen AWT, Swing, JavaFX & SWT 2
W Anzeige von anderen Bildformaten: BMP, TIFF, PCX AWT, Swing, JavaFX & SWT 5
G JList: Anzeige von null-Werten verhindern AWT, Swing, JavaFX & SWT 3
I Problem mit korrekter Anzeige AWT, Swing, JavaFX & SWT 2
G Gibts ne Klasse zur Anzeige von Ziffern? AWT, Swing, JavaFX & SWT 4
S Anzeige-Wirrwar in JScrollbar AWT, Swing, JavaFX & SWT 3
B Anzeige eines SpinnerNumberModel AWT, Swing, JavaFX & SWT 3
MiMa Optimieren einer Methode zum Zentrieren von Fenstern AWT, Swing, JavaFX & SWT 0
T VerifyListener - Ersetzen einer 0 AWT, Swing, JavaFX & SWT 5
I JavaFX JavaFx-Anwendung für die Erstellung einer Windows-Anwendung? AWT, Swing, JavaFX & SWT 6
J Drag und drop aus einer JTable - bitte um Unterstützung AWT, Swing, JavaFX & SWT 2
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
M Daten zufällig Einlesen aus einer Datei (binäres Format) AWT, Swing, JavaFX & SWT 7
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
Jose05 Aus einer normalen Java Klasse eine FXML-Klasse laden AWT, Swing, JavaFX & SWT 12
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
I Hilfe bei dem Erstellen einer SQL Abfrage aus gewählten JComboBoxen AWT, Swing, JavaFX & SWT 5
L Swing TextPanel Schrift untereinander und auf einer Höhe AWT, Swing, JavaFX & SWT 3
mananana Mögliche probleme die in einer GUI passieren Können AWT, Swing, JavaFX & SWT 6
I JTable mit einem Button zu einer Detail Seite springen AWT, Swing, JavaFX & SWT 4
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15

Ähnliche Java Themen

Neue Themen


Oben