puertas para materiales los frases etapas ciclo cerrar cerrando avanzar user-interface javafx javafx-2

user-interface - materiales - cerrar puertas para avanzar



JavaFX2: cerrar una etapa(subprograma) desde dentro de sí mismo (2)

Puede derivar la etapa que se cerrará desde el evento pasado al controlador de eventos.

new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent actionEvent) { // take some action ... // close the dialog. Node source = (Node) actionEvent.getSource(); Stage stage = (Stage) source.getScene().getWindow(); stage.close(); } }

Soy nuevo en JavaFx y estoy creando una aplicación que necesitaba algo similar a JDialog que se ofrecía al usar componentes swing. Lo resolví creando una nueva etapa, pero ahora necesito una forma de cerrar la nueva etapa desde su interior haciendo clic en un botón. (Sí, el botón x también funciona, pero también lo quería en el botón). Para describir la situación: tengo una clase principal desde la cual creo el escenario principal con una escena. Yo uso FXML para eso.

public void start(Stage stage) throws Exception { Parent root = FXMLLoader.load(getClass().getResource("Builder.fxml")); stage.setTitle("Ring of Power - Builder"); stage.setScene(new Scene(root)); stage.setMinHeight(600.0); stage.setMinWidth(800.0); stage.setHeight(600); stage.setWidth(800); stage.centerOnScreen(); stage.show(); }

Ahora, en la ventana principal que aparece, tengo todos los elementos de control y menús y cosas, hechos a través de FXML y la clase de control adecuada. Esa es la parte donde decidí incluir la información Acerca de en el menú Ayuda. Así que tengo un evento que sucede cuando el menú Ayuda - Acerca de está activado, así:

@FXML private void menuHelpAbout(ActionEvent event) throws IOException{ Parent root2 = FXMLLoader.load(getClass().getResource("AboutBox.fxml")); Stage aboutBox=new Stage(); aboutBox.setScene(new Scene(root2)); aboutBox.centerOnScreen(); aboutBox.setTitle("About Box"); aboutBox.setResizable(false); aboutBox.initModality(Modality.APPLICATION_MODAL); aboutBox.show(); }

Como se ve, la ventana Acerca de cuadro se crea a través de FXML con clase de control nuevamente. Hay una imagen, un área de texto y un botón, y quiero que ese botón cierre la nueva etapa que es el aboutBox dentro de la clase AboutBox.java, por así decirlo.

La única forma en que pude hacer esto fue definir un static stage Stage aboutBox público; dentro de la clase Builder.java y referencia a esa desde el método AboutBox.java en el que se maneja el evento de acción en el botón de cierre. Pero de alguna manera no se siente exactamente limpio y correcto. ¿Hay alguna forma mejor?

Gracias de antemano por sus consejos.


En JavaFX 2.1, tiene pocas opciones. De la misma manera que en la respuesta de jewelsea o la forma en que ya lo has hecho o la versión modificada de ella,

public class AboutBox extends Stage { public AboutBox() throws Exception { initModality(Modality.APPLICATION_MODAL); Button btn = new Button("Close"); btn.setOnAction(new EventHandler<ActionEvent>() { @Override public void handle(ActionEvent arg0) { close(); } }); // Load content via // EITHER Parent root = FXMLLoader.load(getClass().getResource("AboutPage.fxml")); setScene(new Scene(VBoxBuilder.create().children(root, btn).build())); // OR Scene aboutScene = new Scene(VBoxBuilder.create().children(new Text("About me"), btn).alignment(Pos.CENTER).padding(new Insets(10)).build()); setScene(aboutScene); // If your about page is not so complex. no need FXML so its Controller class too. } }

con el uso como

new AboutBox().show();

en el controlador de evento de acción del elemento de menú.