usar - cierre la ventana de fxml por código, javafx
javafx ventanas secundarias (7)
- dale a tu botón de cerrar un fx: id, si aún no lo has hecho:
<Button fx:id="closeButton" onAction="#closeButtonAction">
En tu clase de controlador:
@FXML private javafx.scene.control.Button closeButton; @FXML private void closeButtonAction(){ // get a handle to the stage Stage stage = (Stage) closeButton.getScene().getWindow(); // do what you have to do stage.close(); }
Necesito cerrar la ventana de fxml actual por código en el controlador
Sé que stage.close () o stage.hide () hacen esto en fx
cómo implementar esto en fxml? Lo intenté
private void on_btnClose_clicked(ActionEvent actionEvent) {
Parent root = FXMLLoader.load(getClass().getResource("currentWindow.fxml"));
Scene scene = new Scene(root);
Stage stage = new Stage();
stage.setScene(scene);
stage.show();
}
¡pero no funciona!
Toda ayuda será muy apreciada. ¡Gracias!
Encontré una buena solución que no necesita un evento para ser activado:
@FXML
private Button cancelButton;
close(new Event(cancelButton, stage, null));
@FXML
private void close(Event event) {
((Node)(event.getSource())).getScene().getWindow().hide();
}
Implementé esto de la siguiente manera después de recibir una NullPointerException
de la respuesta aceptada.
En mi FXML:
<Button onMouseClicked="#onMouseClickedCancelBtn" text="Cancel">
En mi clase de Controller
:
@FXML public void onMouseClickedCancelBtn(InputEvent e) {
final Node source = (Node) e.getSource();
final Stage stage = (Stage) source.getScene().getWindow();
stage.close();
}
No estoy seguro de si esta es la mejor manera (o si funciona), pero podría intentar:
private void on_btnClose_clicked(ActionEvent actionEvent) {
Window window = getScene().getWindow();
if (window instanceof Stage){
((Stage) window).close();
}
}
(Suponiendo que su controlador es un Nodo. De lo contrario, primero debe obtener el nodo (getScene () es un método de Nodo)
Si tiene una ventana que amplía javafx.application.Application;
puedes usar el siguiente método
Platform.exit();
Ejemplo:
public class MainGUI extends Application {
.........
Button exitButton = new Button("Exit");
exitButton.setOnAction(new ExitButtonListener());
.........
public class ExitButtonListener implements EventHandler<ActionEvent> {
@Override
public void handle(ActionEvent arg0) {
Platform.exit();
}
}
Editar por la belleza de Java 8:
public class MainGUI extends Application {
.........
Button exitButton = new Button("Exit");
exitButton.setOnAction(actionEvent -> Platform.exit());
}
simplemente puedes lograr esto con,
@FXML
private void closeAction(ActionEvent evt){
System.exit(0);
}
hará el truco para ti.
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent we) {
Platform.setImplicitExit(false);
stage.close();
}
});
Es equivalente a hide
. Entonces, cuando lo va a abrir la próxima vez, simplemente verifique si el objeto de stage
está cerrado o no. Si se sale, simplemente show()
es decir (stage.show())
llamada. De lo contrario, debes comenzar la etapa.