2012-07-13 20 views
5

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.JavaFX2: Cerrar una etapa (subprograma) desde su interior

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 los menús y otras cosas, realizadas a través de FXML y la clase de control apropiado. Esa es la parte donde decidí incluir la información Acerca de en el menú Ayuda. Así que tengo un evento en cuando el menú Ayuda - Sobre se activa, como esto:

@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 la caja se crea a través de FXML con la clase de control de nuevo. 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 escenario estático público aboutBox; dentro de la clase Builder.java y la referencia a esa desde dentro del método AboutBox.java que 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.

Respuesta

21

Puede derivar la etapa para 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(); 
    } 
} 
+8

Cerrar el escenario de esta manera evita el controlador de eventos onCloseRequest (si hay alguno). Agregaría la línea stage.getOnCloseRequest(). Handle (null); justo antes de stage.close(); – beardedlinuxgeek

+1

Gracias @beardedlinuxgeek. Tuve este problema: mi ventana se estaba cerrando, pero el controlador de eventos que había registrado no se llamaba. Su solución solucionó el problema. –

1

En JavaFX 2.1, tiene pocas opciones. La manera como respuesta en la jewelsea o la forma en que lo ha hecho ya con una antelación versión de la misma como

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 elemento de menú controlador de eventos de acción.

+0

Actualmente tiene un poco de dificultad con la solución. Parece que no le gusta la primera versión con el FXML. – Meg

+0

Parece que el problema es que llamas a la clase AboutBox.java, que se supone que es la clase de control para AboutBox.fxml, a menos que esa sea la razón por la que escribiste AboutPage.fxml < – Meg

+0

@Meg. Actualizado la respuesta. AboutBox.java tampoco es el controlador de AboutBox.fxml o AboutPage.fxml. –

Cuestiones relacionadas