Applikation mit mehreren Scenes

MarkusM

Aktives Mitglied
Hallo,

ich bin noch relativ frisch mit JavaFX unterwegs und wollte mal fragen, wie Ihr eine JavaFX-Applikation mit mehreren Scenes in der Praxis lösen würdet.

Folgende Ausgangslage:
Ich möchte genre eine kleine "Testanwendung" schreiben in der zunächst ein Anmeldedialog (Scene) erscheinen soll. Nach erfolgter Anmeldung wird der Dialog geschlossen und die eigentliche Applikation (andere Scene) wird gestartet. Hört sich einfach an, aber ich stehe echt auf dem Schlauch...

Hier mal der Code:

Java:
import java.io.IOException;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;
	 
	
public class App extends Application {
	
	public static void main(String[] args) {
        launch(args);
	}
	
    @Override
    public void start(Stage stage) {
        Parent root;
		try {
			root = FXMLLoader.load(getClass().getResource("LoginDialog.fxml"));
			stage.setTitle("User Login");
	    	stage.setScene(new Scene(root));
	    	stage.show();
	        
		} catch (IOException e) {
			e.printStackTrace();
		}
     }
}

Java:
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.PasswordField;
import javafx.scene.control.TextField;

public class FXMLController implements Initializable{

	@FXML private TextField textfieldUsername;
	@FXML private PasswordField passwordfieldPassword;
	@FXML  protected void buttonLogin(ActionEvent event){
		System.out.println("Login | Username: "+ textfieldUsername.getText()+" | Password: "+ passwordfieldPassword.getText()); //  + passwordfieldPassword.getText()
		// Scene schliessen und Application starten.... HIER HÄNGE ICH FEST!!!

	}
	@Override
	public void initialize(URL arg0, ResourceBundle arg1) {
		// TODO Auto-generated method stub
	}
}

LoginDialog.fxml
[XML]
<?xml version="1.0" encoding="UTF-8"?>
<?import java.lang.*?>
<?import java.util.*?>
<?import javafx.geometry.*?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.paint.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="153.0" prefWidth="217.0" xmlns:fx="http://javafx.com/fxml" fx:controller="com.userlogin.FXMLController">
<children>
<GridPane layoutX="7.0" layoutY="15.0">
<children>
<TextField fx:id="textfieldUsername" prefWidth="200.0" promptText="Username" GridPane.columnIndex="1" GridPane.rowIndex="1" />
<PasswordField id="passwordfirldPassword" fx:id="passwordfieldPassword" prefWidth="200.0" promptText="Password" GridPane.columnIndex="1" GridPane.rowIndex="2" />
<Label id="textfieldUsername" text="Username:" GridPane.columnIndex="0" GridPane.rowIndex="1" />
<Label text="Password:" GridPane.columnIndex="0" GridPane.rowIndex="2" />
<Label alignment="TOP_LEFT" contentDisplay="TOP" prefWidth="200.0" text="User Login" GridPane.columnIndex="0" GridPane.columnSpan="2147483647" GridPane.rowIndex="0">
<font>
<Font name="System Bold" size="20.0" />
</font>
</Label>
</children>
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
</columnConstraints>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
<HBox alignment="CENTER_RIGHT" layoutY="105.0" prefHeight="41.0" prefWidth="207.0">
<children>
<Button fx:id="buttonLogin" alignment="CENTER_RIGHT" contentDisplay="CENTER" mnemonicParsing="false" onAction="#buttonLogin" prefHeight="21.999908447265625" text="Login" />
</children>
<padding>
<Insets bottom="10.0" left="10.0" right="10.0" top="10.0" />
</padding>
</HBox>
</children>
</AnchorPane>
[/XML]

Ich müsste in der Klasse FXMLController nach der Aufruf des "buttonLogin" die aktuelle Scene schliessen und eine neue Scene öffnen. Nur wie mache ich das? Komme ich von der FXMLController Klasse irgendwie an die Stage aus der App Klasse? Der FXMLController wird ja durch den FXMLLoader geladen, so dass ich keine Referenz übergeben kann.

Hat jemand eine Idee? Oder bin ich gar völlig auf dem Holzweg?

Viele Grüße

Markus
 

BlackC

Mitglied
Am einfachsten ist, du ersetzt die aktuelle scene (dein Login) mit der neuen. Die stage ist ja deine Applikation, die jeweils nur eine scene hat. Um jetzt diese zu wechseln, muss du in deiner Main-Klasse (App ) eine entsprechende Methode schreiben. Diese rufst du dann beim Klick auf dein Loginbutton auf. Deinem Controller vom LoginView kannst du ja der Main-Klasse übergeben.

Ich poste mal meinen Code von meinem aktuellen Projekt. Hoffe, dieser hilft dir.


Java:
public class Main extends Application {    
    private Stage stage;
    private final double MINIMUM_WINDOW_WIDTH = 1024.0;
    private final double MINIMUM_WINDOW_HEIGHT = 768.0;
    //private User _persowareUser =  new User();
    private String _companyName = "";
    
    // Startet die Applikation undmit goToLogin wird der Login-Bildschirm geladen
@Override
    public void start(Stage primaryStage) throws Exception {
        _companyName = getParameters().getNamed().get("NameOfCompany");
        stage = primaryStage;
        stage.setTitle("Persoware");
        stage.setMinWidth(MINIMUM_WINDOW_WIDTH);
        stage.setMinHeight(MINIMUM_WINDOW_HEIGHT);
        gotoLogin();
        primaryStage.show();
    }
    // Hier starte ich mein Hauptfenster
    public void gotoApplication(ProgressBar _progressBar) {
        try {
            _progressBar.setProgress(0.75);
            MainViewController mainView = (MainViewController) replaceSceneContent("/gui/MainView.fxml");
            _progressBar.setProgress(0.95);
            mainView.setApp(this);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

    public void gotoLogin() {
        try {
            final LoginViewController login = (LoginViewController) generateSceneContent("/gui/LoginView.fxml");// Pfad anpassen
            login.setApp(this);
            login.setTfFirmennameText(_companyName);
        } catch (Exception ex) {
            Logger.getLogger(Main.class.getName()).log(Level.SEVERE, null, ex);
        }
    }

//    public User getPersowareUser() {
//        return _persowareUser;
//    }
//
//    public void setPersowareUser(User _persowareUser) {
//        this._persowareUser = _persowareUser;
//    }
    
    private Initializable replaceSceneContent(String fxml) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        InputStream in = Main.class.getResourceAsStream(fxml);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(Main.class.getResource(fxml));
        VBox page;
        try {
            page = (VBox) loader.load(in);
        } finally {
            in.close();
        }
        page.autosize();
        stage.getScene().setRoot(page);
        //stage.sizeToScene();
        
        return (Initializable) loader.getController();
    }
    
     private Initializable generateSceneContent(String fxml) throws Exception {
        FXMLLoader loader = new FXMLLoader();
        InputStream in = Main.class.getResourceAsStream(fxml);
        loader.setBuilderFactory(new JavaFXBuilderFactory());
        loader.setLocation(Main.class.getResource(fxml));
        VBox page;
        try {
            page = (VBox) loader.load(in);
        } finally {
            in.close();
        }
        Scene scene = new Scene(page, 1024, 768);
        scene.getStylesheets().add("/data/style/persoware.css");
        stage.setResizable(true);
        stage.setScene(scene);        
        stage.sizeToScene();
        return (Initializable) loader.getController();
        
    }
     
    public String getCompanyName(){
        return this._companyName;
    }
   
    /**
     * The main() method is ignored in correctly deployed JavaFX application.
     * main() serves only as fallback in case the application can not be
     * launched through deployment artifacts, e.g., in IDEs with limited FX
     * support. NetBeans ignores main().
     *
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}

Würde dir gern auch noch das Tutorial von Oracle empfehlen, dass hat mir zumindest gut geholfen und löst auch dein beschriebenes Problem, falls du mit meiner Lösung nicht klar kommen solltest.
 

MarkusM

Aktives Mitglied
Vielen Dank, das Beispiel schaue ich mir mal in Ruhe an.

Mit den Oracle Tutorials habe ich viel Zeit verbracht, aber die Stelle zum Wechseln der Scene habe ich wohl irgendwie überlesen...
 
Zuletzt bearbeitet:

MarkusM

Aktives Mitglied
Alles klar, es funktioniert! :D

Vielen Dank nochmal für das Aufzeigen des Weges! Der Zugriff auf den Controller ist aber auch wirklich gut versteckt...
 

BlackC

Mitglied
Alles klar, es funktioniert! :D

Vielen Dank nochmal für das Aufzeigen des Weges! Der Zugriff auf den Controller ist aber auch wirklich gut versteckt...

Das muss ich mir wohl auf die Fahne schreiben. Wenn man es selber programmiert hat, ist einem das ja klar, wie es funktioniert und lässt dann meistens die Kommentare weg (ich zumindest). Dadurch ist es natürlich schwierig für andere , den Code nachzuvollziehen.

Aber du bist ja zurecht gekommen, dann freut es mich, das ich helfen konnte :)
 

MarkusM

Aktives Mitglied
Durch Deinen Code bin ich eigentlich ganz gut durchgestiegen. Mit versteckt meinte ich eher den JavaFX Mechanismus des FXMLLoaders, der den Zugriff auf den Controller aus meiner Sicht ganz gut "versteckt".
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
ExceptionOfExpectation Mit einer laufenden GUI Applikation eine Datei in dem Rechner löschen AWT, Swing, JavaFX & SWT 2
N JavaFX applikation auf anderen Systemen zum laufen bringen AWT, Swing, JavaFX & SWT 7
S Swing-Applikation die ein Numpad nachbildet samt Keybindings..? AWT, Swing, JavaFX & SWT 5
M JavaFX Applikation lädt Scrollpanes nicht AWT, Swing, JavaFX & SWT 19
N Applikation startet nicht AWT, Swing, JavaFX & SWT 2
L LookAndFeel Eigenes Design für die Applikation AWT, Swing, JavaFX & SWT 4
C Swing globale "Key Bindings" für Swing-Applikation AWT, Swing, JavaFX & SWT 6
D JDialog alwaysOnTop, aber nur innerhalb der Applikation AWT, Swing, JavaFX & SWT 3
C Java-applikation über Fullscreen AWT, Swing, JavaFX & SWT 4
dzim SWT SWT-AWT-Problem: Crash einer Applikation AWT, Swing, JavaFX & SWT 8
maddin86 Browserfenster / Webbrowser in Java Applikation einbetten AWT, Swing, JavaFX & SWT 15
S Client-Server-Applikation mit GUI - Bugs ausmerzen AWT, Swing, JavaFX & SWT 4
B Swing Sprünge in einer Swing Desktop Applikation AWT, Swing, JavaFX & SWT 2
L JavaFX in Java Applikation einbinden AWT, Swing, JavaFX & SWT 2
M Swing Java Applikation in MVC gut strukturieren AWT, Swing, JavaFX & SWT 14
M Swing Ändern des Themes einer fremden Applikation AWT, Swing, JavaFX & SWT 8
R Applikation so sehen wie ein Saudi oder Japaner..? AWT, Swing, JavaFX & SWT 4
S Allgemeine Frage zur Unterbringung von allgemeinen Daten einer Applikation AWT, Swing, JavaFX & SWT 2
P Schriftart setzen für die ganze Applikation AWT, Swing, JavaFX & SWT 3
J Applikation als Desktop-"Widget" AWT, Swing, JavaFX & SWT 2
GambaJo GUI sieht in NB anders aus, als fertige Applikation AWT, Swing, JavaFX & SWT 2
T WaitCursor zuverlässig für die ganze Applikation setzen? AWT, Swing, JavaFX & SWT 3
W Soundeffekt in Applikation AWT, Swing, JavaFX & SWT 3
G Desktopverhalten einer Applikation AWT, Swing, JavaFX & SWT 6
M Windows-Fensterinhalt in Java-Applikation darstellen AWT, Swing, JavaFX & SWT 6
M Swing Applikation mit Fenster "inside" AWT, Swing, JavaFX & SWT 2
M google maps in Java-Applikation AWT, Swing, JavaFX & SWT 13
S Tastaturevents an eine externe Applikation weiter leiten AWT, Swing, JavaFX & SWT 6
G Seltsames Phänomen beim starten meiner Applikation AWT, Swing, JavaFX & SWT 8
isowiz Einige Fragen zur ersten eigenen Sing-Applikation AWT, Swing, JavaFX & SWT 4
A Applikation mit Netbeans-Design AWT, Swing, JavaFX & SWT 4
L Java-Logo in Java-Applikation durch eignes ersetzen AWT, Swing, JavaFX & SWT 12
M Anzeigefehler nach langer Laufzeit der Applikation AWT, Swing, JavaFX & SWT 4
N Netzwerk-Applikation, SWT und Threads AWT, Swing, JavaFX & SWT 4
G ConsolenFenster in Applikation einbinden? AWT, Swing, JavaFX & SWT 2
O Applikation mit unterschiedlichen Fenstern AWT, Swing, JavaFX & SWT 4
O Problem beim Umwandeln eines Applets in eine Applikation AWT, Swing, JavaFX & SWT 15
G Mediaplayer oder ähnliches in Java-Applikation einbinden AWT, Swing, JavaFX & SWT 2
G Ikonli in Fat-Jar mit mehreren Icon-Packs einbinden AWT, Swing, JavaFX & SWT 5
F Zeile in mehreren Jtables bei Selektion markieren AWT, Swing, JavaFX & SWT 11
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
P JavaFx - Progressbar - Füllen mittels mehreren Tasks AWT, Swing, JavaFX & SWT 0
O Basics - Anwendung erstellen mit mehreren Szenen AWT, Swing, JavaFX & SWT 1
N Taschenrechner mit mehreren Rechnungen AWT, Swing, JavaFX & SWT 18
M Swing MVC-Pattern - View mit mehreren Models AWT, Swing, JavaFX & SWT 5
B JavaFX PrinterJob mit mehreren Seiten AWT, Swing, JavaFX & SWT 0
T JavaFX Label mit mehreren Images AWT, Swing, JavaFX & SWT 11
R KeyListener in mehreren Panels AWT, Swing, JavaFX & SWT 5
M Ein Element in mehreren JList selektieren AWT, Swing, JavaFX & SWT 5
W Swing JPanel nur einmal nach mehreren Änderungen neu zeichnen AWT, Swing, JavaFX & SWT 1
S JComboBox mit mehreren Spalten? AWT, Swing, JavaFX & SWT 6
K Swing Keine Reaktion auf Tastatureingaben bei mehreren Buttons??? AWT, Swing, JavaFX & SWT 4
M Swing MVC mit mehreren Klassen AWT, Swing, JavaFX & SWT 2
J JavaFX eine Art Tabelle, jedoch mit mehreren Zeilen AWT, Swing, JavaFX & SWT 2
K Swing Klassenstruktur mit mehreren JPanels AWT, Swing, JavaFX & SWT 3
F Swing JAVA GUI Übergabe von Werten zwischen mehreren Fenstern/Klassen AWT, Swing, JavaFX & SWT 10
A JButton - Klicks zählen auf mehreren Buttons AWT, Swing, JavaFX & SWT 2
J Mit mehreren in Objekten in JFrame printen? AWT, Swing, JavaFX & SWT 8
P Liste mit Icons und mehreren Spalten AWT, Swing, JavaFX & SWT 7
B Swing Formular mit mehreren Elementen - wie die ActionListener-Verarbeitung lösen? AWT, Swing, JavaFX & SWT 2
S Shape erstellen der aus mehreren Elementen besteht..? AWT, Swing, JavaFX & SWT 3
F Tablemodel zu mehreren Tabellen AWT, Swing, JavaFX & SWT 6
T Sichtbarmachen von Objekten auf mehreren JPanels AWT, Swing, JavaFX & SWT 2
DamienX Swing Component auf mehreren Containern AWT, Swing, JavaFX & SWT 2
B Swing JFormattedTextField auf mehreren JPanels in einer JTabbedPane AWT, Swing, JavaFX & SWT 3
M In Jlist auf Änderungen von mehreren JLabels reagieren AWT, Swing, JavaFX & SWT 3
E JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 14
B SWT SWT Tree mit mehreren Spalten AWT, Swing, JavaFX & SWT 3
W GUI in mehreren Threads AWT, Swing, JavaFX & SWT 5
J Swing JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 4
T Auf Ende von mehreren Threads warten, ohne den EDT zu blockieren AWT, Swing, JavaFX & SWT 1
J SWING Fenster mit mehreren JPanels (dank JLayeredPane) AWT, Swing, JavaFX & SWT 19
T Swing KeyListener mit mehreren Objekten AWT, Swing, JavaFX & SWT 2
G Verliere Referenz von Toolbar bei mehreren Fenster AWT, Swing, JavaFX & SWT 3
M MVC: Grundidee verstanden aber was machen mit mehreren Model AWT, Swing, JavaFX & SWT 2
R Daten in JTable in mehreren Zeilen darstellen AWT, Swing, JavaFX & SWT 11
G JDialog mit mehreren Elementen! AWT, Swing, JavaFX & SWT 5
G Ein Frame mit mehreren austauschbaren Panels AWT, Swing, JavaFX & SWT 3
S JTable audrucken, aber mit mehreren Footers und Headers AWT, Swing, JavaFX & SWT 2
O Zwischen mehreren Bildern wechseln AWT, Swing, JavaFX & SWT 6
S Enter in JLabel - oder: JTabbedPane mit mehreren JLabel AWT, Swing, JavaFX & SWT 3
I Arbeiten mit mehreren Fenstern AWT, Swing, JavaFX & SWT 4
H jar-archive mit mehreren Klassen erstellen AWT, Swing, JavaFX & SWT 3
G Organisation Anwendung mit mehreren Eingabedialogen AWT, Swing, JavaFX & SWT 3
L Probleme mit mehreren Canvas: Überlagerungseffekte? AWT, Swing, JavaFX & SWT 5
N JComboBox mit mehreren Spalten AWT, Swing, JavaFX & SWT 21
Q Auf mehreren JPanels Bilder zeichnen. AWT, Swing, JavaFX & SWT 5
T Swing: MainForm mit mehreren Tabs AWT, Swing, JavaFX & SWT 6
K Spaltenbreite von mehreren Tabellen gleichzeitig verändern AWT, Swing, JavaFX & SWT 3
H JTable Text aus mehreren Zellen in einer Spalte kopieren? AWT, Swing, JavaFX & SWT 3
R Navigieren zwischen mehreren Fenstern AWT, Swing, JavaFX & SWT 7
U Anwendung mit mehreren "Fenstern" AWT, Swing, JavaFX & SWT 4
M JDialog mit mehreren Eingabenfeldern? AWT, Swing, JavaFX & SWT 5
M jtabbedpane mit mehreren layoutmanagern? AWT, Swing, JavaFX & SWT 2
V Werte mehreren Checkboxes zuweisen AWT, Swing, JavaFX & SWT 3
T JList mit mehreren spalten AWT, Swing, JavaFX & SWT 2
M Mit mehreren Panels arbeiten AWT, Swing, JavaFX & SWT 2
A JFrame mit mehreren Panels AWT, Swing, JavaFX & SWT 10
P JTable nach mehreren Spalten sortieren AWT, Swing, JavaFX & SWT 15
V JTable mit mehreren Componenten in einer Spalte ? AWT, Swing, JavaFX & SWT 6

Ähnliche Java Themen

Neue Themen


Oben