Java >> Java tutorial >  >> Tag >> switch

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);
}

Java tag