Sådan skifter du scener i JavaFX
Jeg skrev denne controller for at holde styr på de forskellige scenegrafer.
public class ScreenController {
private HashMap<String, Pane> screenMap = new HashMap<>();
private Scene main;
public ScreenController(Scene main) {
this.main = main;
}
protected void addScreen(String name, Pane pane){
screenMap.put(name, pane);
}
protected void removeScreen(String name){
screenMap.remove(name);
}
protected void activate(String name){
main.setRoot( screenMap.get(name) );
}
}
Så jeg kan skrive:
ScreenController screenController = new ScreenController(scene);
screenController.add("calculator", FXMLLoader.load(getClass().getResource( "calculator.fxml" )));
screenController.add("testSwitch", FXMLLoader.load(getClass().getResource( "TestSwitch.fxml" )));
screenController.activate("calculator");
Dette var en løsning for en fuldskærmsapplikation, hvor MacOS fuldskærmsovergangen blev vist, hver gang en scene skifter scene.
I stedet for at skifte Scenes
, skift en rodnode på allerede eksisterende Scene
Hvis du vil være med til at ændre scenen, vil du gøre det på denne måde (bemærk, at scenen er medlem af applikationen):
private Stage primaryStage;
@Override
public void start(Stage primaryStage) throws Exception {
this.primaryStage = primaryStage;
...
}
public void changeScene(String fxml){
Parent pane = FXMLLoader.load(
getClass().getResource(fxml));
Scene scene = new Scene( pane );
primaryStage.setScene(scene);
}
Men som allerede påpeget af @Eugene_Ryzhikov er det en bedre løsning blot at ændre rodindholdet i den eksisterende scene:
public void changeScene(String fxml){
Parent pane = FXMLLoader.load(
getClass().getResource(fxml));
primaryStage.getScene().setRoot(pane);
}