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.*;
import java.awt.event.*;
import javax.swing.*;
public class JProgressBarDemo extends JFrame
{
JProgressBar bar = new JProgressBar( 0, 1000000 );
public JProgressBarDemo()
{
setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
JButton but = new JButton( "Start zählen" );
but.addActionListener( new ButtonActionListener() );
add( bar, BorderLayout.PAGE_START );
add( but, BorderLayout.PAGE_END );
pack();
}
private class ButtonActionListener implements ActionListener
{
public void actionPerformed( ActionEvent e )
{
new Thread()
{
@Override
public void run()
{
for ( int i = 1; i <= bar.getMaximum(); ++i )
{
final int j = i;
SwingUtilities.invokeLater( new Runnable()
{
public void run() {
bar.setValue( j );
}
} );
}
}
}.start();
}
}
public static void main( String[] args )
{
new JProgressBarDemo().setVisible( true );
}
}
Auf der Oberfläche sind ein JButton und ein JProgressBar aufgebracht. Der JButton soll, wenn er gedrückt wird, einen Hintergrund-Thread anstoßen, der die Fortschrittsanzeige hochzählt. Das Beispiel ist insofern komplex, als 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 gestartete Thread darf keine Methoden auf Swing-Komponenten aufrufen – das darf nur der AWT-Thread. Andernfalls könnten zwei Programmteile parallel eine Swing-Komponente verändern, was den Zustand ruinieren kann; Swing-Komponenten sind nicht gegen parallelen Zugriff geschützt. Die Veränderung des Fortschritts über setValue() muss also aus dem eigenen Nicht-AWT-Thread heraus erfolgen. Dazu dient die Methode invokeLater(). Sie erzeugt ein in die Ereigniswarteschlange eingefügtes Ereignis. 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(). |
|