15.16 Der Fortschrittsbalken JProgressBar
 
Mit der Komponente für einen Fortschrittsbalken (auch Verlaufsbalken genannt) lassen sich Anzeigen visualisieren, die das Vorankommen (den Status) einer Anwendung beschreiben. Der Fortschrittsbalken JProgressBar, der unter dem AWT keine Entsprechung hat, lässt sich mit mehreren Konstruktoren erzeugen. Der Standard-Konstruktor erzeugt einen horizontalen Fortschrittsbalken. Es existieren zusätzliche Konstruktoren für die Orientierung JProgressBar.HORIZONTAL und JProgressBar.VERTICAL und ein eingestelltes Maximum und Minimum. Nachträglich lassen sich diese Eigenschaften mit setOrientation(int), setMinimum(int) und setMaximum(int) ändern.
 Hier klicken, um das Bild zu Vergrößern
Abbildung 15.16
Anzeige eines Fortschrittsbalkens
Listing 15.23
JProgressBarDemo.java
import java.awt.BorderLayout;
import java.awt.event.*;
import javax.swing.*;
public class JProgressBarDemo
{
final static int max = 20;
static JProgressBar bar = new JProgressBar( 0, max );
public static void main( String args[] )
{
JFrame frame = new JFrame();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JButton b = new JButton( "Start zählen" );
b.addActionListener( new ButtonActionListener() );
frame.getContentPane().add( bar, BorderLayout.NORTH );
frame.getContentPane().add( b, BorderLayout.SOUTH );
frame.pack();
frame.setVisible( true );
}
static class ButtonActionListener implements ActionListener
{
public void actionPerformed( ActionEvent e )
{
new Thread( new Runnable()
{
public void run()
{
for ( int i = 1; i <= max; i++ )
{
try { Thread.sleep( 1000 ); } catch ( InterruptedException e ) { }
final int j = i;
SwingUtilities.invokeLater( new Runnable()
{
public void run()
{
bar.setValue( j );
}
} );
}
}
} ).start();
}
}
}
Auf der Oberfläche sind ein JButton und ein JProgressBar aufgebracht. Der JButton soll, wenn er gedrückt wird, einen Hintergrundtherad anstoßen, der die Fortschrittsanzeige hochzählt. Das Beispiel ist insofern komlex, als dass viele Objekte benötigt werden:
|
Der Listener. Damit die Applikation die Aktivierung der Schaltfläche erkennt, wird die Klasse ButtonActionListener programmiert. |
|
Für das nebenläufige Programm benötigen wir einen Thread, der die Anweisungen über die run()-Methode des Runnable-Objekts bekommt. |
|
Der gestartete Thread darf keine Methoden auf Swing-Komponenten aufrufen – das darf nur der AWT-Thread. Anderfalls könnten zwei Programmteile parallel eine Swing-Komponente verändern, was den Zustand ruinieren kann; Swing-Komponenten sind nicht gegen parallenen Zugriff geschützt. Die Veränderung des Fortschritts über setValue() muss also aus dem eigenen nicht-AWT-Thread heraus. Dazu dient die Methode invokeLater(). Sie erzeugt ein Ereignis, welches in die Ereigniswarteschlage eingefügt wird. Wird das Ereignis vom AWT-Thread bearbeitet, führt er den Programmcode in der run()-Methode vom übergebenen Runnable aus. Wir sprechen später noch ausführlicher über invokeLater(). |
|