Presta atención porque en este post hallarás el hallazgo que buscas.Este post ha sido aprobado por nuestros especialistas para asegurar la calidad y exactitud de nuestro contenido.
Solución:
Escribí este controlador para realizar un seguimiento de los diferentes escenarios.
public class ScreenController
private HashMap 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) );
Entonces puedo escribir:
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");
Esta fue una solución para una aplicación de pantalla completa, donde la transición de pantalla completa de MacOS se mostraba cada vez que un escenario cambiaba de escena.
en lugar de cambiar Scenes
cambie un nodo raíz a uno ya existente Scene
Si desea continuar con el cambio de escena, lo haría así (tenga en cuenta que el escenario es un miembro de la aplicación):
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);
Sin embargo, como ya señaló @Eugene_Ryzhikov, es una mejor solución simplemente cambiar el contenido raíz de la escena existente:
public void changeScene(String fxml)
Parent pane = FXMLLoader.load(
getClass().getResource(fxml));
primaryStage.getScene().setRoot(pane);
Agradecemos que quieras añadir valor a nuestro contenido informacional tributando tu experiencia en las anotaciones.