Swing GlassPane Progress with JavaFX ProgressIndicator

Mit diesem kleinen Tutorial möchte ich euch zeigen, wie einfach ihr mit Hilfe von JavaFX, einen coolen Progress auf eure Swing-Anwendung zaubert.

1. Vorbereitung

Bevor wir mit dem Programmieren anfangen können, erstellen wir uns in Eclipse ein neues Projekt und binden die jfxrt.jar ein. Die Jar-Datei findet ihr in der Regel unter C:\Program Files\Java\jdk1.7.0_xx\jre\lib oder wo auch immer ihr euer Java 1.7 installiert habt.

2. Projekt

Für dieses Tutorial habe ich mir ein einfaches Anwendungsbeispiel für eine GlassPane mit Progress überlegt. Wir gehen davon aus, dass wir eine Anwendung haben, bei der sich ein Benutzer anmelden kann. Da es bei der Authentifizierung an einem Server meistens etwas dauert, können wir mit einem Progress dem Benutzer einen Status über den Anmeldevorgang liefern.

2.1 Main

public class Main {
    public static void main(String[] args) {
        new LoginFrame();
    }
}

2.2 FXProgressPanel

Damit wir JavaFX-Inhalte in unserer Swing-Anwendung überhaupt anzeigen können, erbt unser Panel von JFXPanel. Da JavaFX in einem eigenen User-Thread läuft, müssen wir unseren JavaFX-Code in ein Runnable verpacken und der Methode Platform.runLater  übergeben.

Ein ProgressIndicator ist in der Lage einen Fortschritt anzuzeigen. In unserem Beispiel kann der Benutzer beim Erzeugen entscheiden, welche Art von Progress er haben möchte.

public class FXProgressPanel extends JFXPanel {
 
    private static final long serialVersionUID = -8292481861229935364L;
 
    private ProgressIndicator progress;
    private BorderPane rootPane = new BorderPane();
    private boolean infiniteProgress = false;
 
    private FXProgressPanel (){
        super();
        Platform.runLater(new Runnable() {
            @Override
            public void run() {
                init();
            }
        });
    }
 
    public FXProgressPanel(boolean infiniteProgress){
        this();
        this.infiniteProgress = infiniteProgress;
    }
 
    private void init() {
        if(infiniteProgress){
            progress = new ProgressIndicator();
        } else {
            progress = new ProgressIndicator(0.0);
        }
        progress.setStyle("-fx-padding: 100");
        progress.setMaxSize(256, 256);
        rootPane.setCenter(progress);
        rootPane.setStyle("-fx-background-color: white");
        rootPane.setOpacity(0.8);
        setScene(new Scene(rootPane, Color.TRANSPARENT));
    }
 
    public void increaseProgress(double value){
        progress.setProgress(value);
    }
 
    public boolean isInfiniteProgress() {
        return infiniteProgress;
    }
}

 

2.3 LoginFrame

Der Thread soll einen einfachen Loginvorgang simulieren.

public class LoginFrame extends JFrame {
 
    private static final long serialVersionUID = 3495500076555535882L;
    private Thread          worker;
    private JTextField      txtUsername;
    private JPasswordField      txtPassword;
    private JButton         btnLogin;
    private FXProgressPanel     glassPane;
    private boolean login   =   false;
 
    public LoginFrame(){
        super();
        initComponents();
        initFrame();
        initThread();
    }
 
    private void initFrame() {
        setTitle("Java FX GlassPane Tutorial");
        setSize(new Dimension(600, 400));
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        add(createJPanel());
        setGlassPane(glassPane);
        setLocationRelativeTo(null);
        setVisible(true);
    }
 
    private void initThread() {
        worker = new Thread(new Runnable() {
            @Override
            public void run() {
                while(true){
                    Thread.yield();
                    while(login){
                        LoginFrame.this.getGlassPane().setVisible(true);
                        try {
                            if(glassPane.isInfiniteProgress()){
                                Thread.sleep(5000);
                            } else {
                                for(double d = 0.0d; d <= 1.1d; d+=0.01d){
                                    glassPane.increaseProgress(d);
                                    Thread.sleep(60);
                                }
                            }
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                        LoginFrame.this.getGlassPane().setVisible(false);
                        login = false;
                    }
                }
            }
        });
        worker.start();
    }
 
    private void initComponents() {
                // true = infiniteProgress 
                // false = finiteProgress
                this.glassPane = new FXProgressPanel(true);
        ...
    }
    private JPanel createJPanel() {
        ...
    }
}

 

3. Ergebnisse

3.1 Progress mit Fortschrittsanzeige

3.2 Progress ohne Fortschrittsanzeige

infiniteProgress

4. Links

Mehr Informationen dazu findet ihr unter docs.oracle.com.

Diesen Artikel veröffentlichte ich bereits vor einiger Zeit auf dieser Seite: www.devtopics.de.

Swing GlassPane Progress with JavaFX ProgressIndicator
Markiert in:                         

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.