Wie kann man eine kontinuierlich laufende Aktivitätsanzeige erzeugen, die in einem eigenen Fenster erscheint?

Die Swing-Bibliothek stellt mit ihren beiden Klassen JProgressBar und ProgressMonitor Möglichkeiten bereit, den Fortschritt einer Operation anzuzeigen. ProgressMonitor erlaubt es jedoch nicht, Fortschritte anzuzeigen, deren Abbruch-Zeitpunkt unbekannt ist. JProgressBar stellt hierzu die Methode setIndeterminate(boolean indeterminate) bereit, ist jedoch von JComponent abgeleitet.

In der Beispielklasse wird im Konstruktor nach Erzeugen eines leeren JFrame die Methode createProgressBarWindow() aufgerufen. In ihr werden zunächst je ein Objekt eines JWindow und einer JProgressBar erzeugt. Nach der Dimensionierung der JProgressBar wird deren Status durch die Methode setIndeterminate(true) auf unbestimmt (indeterminate) gesetzt. Dies bedeutet, das diese Anzeige prinzipiell bis in alle Ewigkeit laufen kann und keinen wirklichen Fortschritt anzeigt.
Die Progressbar wird dem Fenster hinzugefügt, die Größe des Fensters gesetzt und schließlich, bevor es sichtbar gemacht wird, zentriert und auf eine hohe Z-Ebene gesetzt, damit es immer als oberstes Fenster erscheint.

import java.awt.BorderLayout;
import java.awt.Dimension;

import javax.swing.JFrame;
import javax.swing.JProgressBar;
import javax.swing.JWindow;
import javax.swing.SwingUtilities;

public class InditerminateProgressBar {

    public InditerminateProgressBar() {
        initFrame();
        createProgressBarWindow();
    }
    
    private void initFrame() {
        JFrame frame = new JFrame("Progress Bar");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.setSize(300, 300);
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    private void createProgressBarWindow() {
        JProgressBar pb = new JProgressBar();
        pb.setPreferredSize(new Dimension(200, pb.getPreferredSize().height - 4));
        pb.setIndeterminate(true);
        JWindow win = new JWindow();
        win.add(pb, BorderLayout.CENTER);
        win.setSize(pb.getPreferredSize());
        win.setAlwaysOnTop(true);
        win.setLocationRelativeTo(null);
        win.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(() -> new InditerminateProgressBar());
    }
}

Wozu dient der leere JFrame? Er ist hier prinzipiell überflüssig und dient nur dazu, das Programm über den fenstereigenen Schließen-Button bequem zu beenden.

Wenn Ihnen javabeginners.de gefällt, freue ich mich über eine Spende an diese gemeinnützigen Organisationen.