JavaFX: Stage-Zugriff mit Singleton

SingletonWenn man sich länger mit dem Thema JavaFX und der zugrunde liegende Anwendungsarchitektur auseinandersetzt, kommt man früher oder später zu der Frage:

Woher bekomme ich die Stage? bzw.

Wo kann ich meine Stage speichern?

In diesem Blogbeitrag stelle ich meinen Lösungsvorschlag mit dem Singleton Design Pattern vor:

 

Singleton Pattern

Wie gesagt beinhaltet mein Lösungsvorschlag das sogenannte Singleton Pattern. Das Singleton Pattern ist ein in der Softwareentwicklung eingesetztes Entwurfsmuster und gehört zur Unterkategorie der Erzeugungsmuster. Es stellt sicher, dass von einer Klasse genau eine Instanz existiert. Des Weiteren ist die Singleton-Instanz global im Code verfügbar.

Bezogen auf unser JavaFX Beispiel ergibt sich folgende Klasse namens StageManager.

 

Die Singleton Klasse

package axxg;

import javafx.stage.Stage;

public class StageManager {
	
    private static StageManager instance;
    private static Stage primaryStage;
 
    /** Konstruktor ist privat, Klasse darf nicht von außen instanziiert werden. */
    private StageManager() {
    }
 
    /**
     * Statische Methode 'getInstance()Ä liefert die einzige Instanz der Klasse zurück.
     * Ist synchronisiert und somit thread-sicher.
     */
    public synchronized static StageManager getInstance() 
    {
        if (instance == null) 
        {
            instance = new StageManager();
        }
        return instance;
    }

	public Stage getPrimaryStage() {
		return primaryStage;
	}

	public void setPrimaryStage(Stage primaryStage) {
		StageManager.primaryStage = primaryStage;
	}  
}

 

Verwendung

Das folgende Skript zeigt die Verwendung des StageManagers in einem “Hallo Welt”-Projekt.

package axxg;

import java.util.Date;

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;


public class Start extends Application {
    public static void main(String[] args) {
        launch(args);
    }
     
    @Override
    public void start(Stage primaryStage) {
    	StageManager.getInstance().setPrimaryStage(primaryStage);
    	
    	
        primaryStage.setTitle("Hallo Welt!");
        Button btn = new Button();
        btn.setText("sag 'Hallo Welt'");
        
        
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
            	StageManager.getInstance().getPrimaryStage().setTitle(new Date().toString());
            }
        });
         
        StackPane root = new StackPane();
        root.getChildren().add(btn);
        primaryStage.setScene(new Scene(root, 300, 250));
        primaryStage.show();
    }
}

 

Fazit

Generell sollte man sehr sparsam mit dem Singleton Pattern umgehen. Es verleitet den Entwickler Sichtbarkeiten (private, public, protected), Speicherverbrauch und co zuvernachlässigen. Jedoch bietet es für unser Stage-Problem eine einfache und elegante Lösung.

 

Copyright © 2013 AxxG – Alexander Gräsel



3 Antworten : “JavaFX: Stage-Zugriff mit Singleton”

  1. jubs sagt:

    Ich finde es nicht sinnvoll ein Singleton dafür zu benutzen. Ein Singleton sollte dann benutzt werden, wenn man z.B. von einer Klasse nur eine Instanz erlauben will (als Beispiel kann man sich ein Shopinventar vorstellen).
    Ne Stage in einem Singleton zu verpacken macht dann Sinn, wenn ein Fenster nur einmal geöffnet werden darf, wobei ich es immernoch besser finde, dann den Auslöser zum Öffnen des Fensters zu disablen.

    Wenn man eine Stage speichern will, bzw man Zugriff auf eine Stage haben will, dann sollte man das entweder über Events lösen oder man übergibt einfach eine vorher als private deklarierte Variable, die die Stage enthält.

    Es geht mir im Grunde darum, dass ich finde, dass ein Singleton nicht als “Speicher” benutzt werden sollte, sondern nur dann Anwendung finden sollte, wenn man nur eine Instanz einer Klasse haben möchte.

    • Hey Jubs,
      eine ähnliche Diskussion habe wir/ich bereits unter meinem Beitrag: “http://blog.axxg.de/2013/01/model-view-controller-mit-javafx/” geführt.

      @Anmerkung
      Ich stimme dir zu, dass das Singleton Pattern mit bedacht eingesetzt werden sollte und wenn möglich, sollte man ganz auf das Pattern verzichten. Speziell in meinem 1-Klassen-Beispiel macht es wenig Sinn und sollte nur kurz die Verwendung des Singleton zeigen^^
      Betrachtet man jedoch den Sachverhalt in einem größeren Kontext (MVC, mehrere Scene, Komplexe Maskenabläufe), ist das Singleton Pattern eine gute Lösung.

  2. Thank you i will use your solution.If meanwhile you have found/wrote better one please share it here.Cheers :)

Trackbacks/Pingbacks

  1. Model - View - Controller mit JavaFX | AxxG Blog - [...] Im Kommentarbereich haben wir bereits eine Diskussion zur Speicherung der Stage geführt. Ein weiterer Lösungsansatz, außer das viewspezifische Model, …

Kommentar verfassen