Für ein neues Fenster kannst du in etwa so hier vorgehen:
[code=Java] @FXML
public void opensettingmenu(ActionEvent event) {
try {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("SettingDialogWindow.fxml"));
Parent root = (Parent) fxmlLoader.load();
// anstelle von
// main.getScene().setRoot(root);
// neue Scene mit dem geladenen root
// Grösse festlegen
Scene settingsScene = new Scene(root, 640, 480);
// Stage ist "Utility"-Fenster (Beeinflusst die Fensterdekoration)
Stage settingsStage = new Stage(StageStyle.UTILITY);
// das Eltern-Fenster festlegen
settingsStage.initOwner(main.getStage());
// Verhindere, dass alle Fenster der Eltern-Hirarchie angeklickt werden könne
// NONE = jedes Fenster kann geklickt werden
// WINDOW_MODAL = kein Fenter der Eltern-Hirarchie, aber andere Fenster, die darunter erstellt wurden
// APPLICATION_MODaL = kein Fenster anklickbar
settingsStage.initModality(Modality.WINDOW_MODAL);
// ist klar
settingsStage.setTitle("Settings");
// ist auch klar
settingsStage.setScene(settingsScene);
// wenn du auf "schliessen"-Events reagieren möchtes, oder sie sogar ablehnen willst -> event.consume()
// funktioniert natürlich auch bei der PrimaryStage im Main
settingsStage.setOnCloseRequest(closeEvent -> {
// react to it in any way
});
settingsStage.setOnShown(showEvent -> {
// z.B. asynchrones Laden von Daten, etc.
});
// zeigt das Fenster, blockert aber hier nicht
// showAndWait() eröffnet dagegen einen "nested-event-loop"
// -> wenn du auf ein Ergebnis warten möchtest, dann showAndWait, sonst show
// -> Ergebnis aber auch über die setOnCloseRequest möglich - geht in Richtung reaktives Programmieren
settingsStage.show();
} catch (IOException e) {
e.printStackTrace();
}
}[/code]