Saltar al contenido

Cómo cambiar escenas en JavaFX

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 Scenescambie 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.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *