ventanas ventana usar una secundarias pasar example entre desde datos controladores como boton abrir java user-interface javafx fxml

usar - cierre la ventana de fxml por código, javafx



javafx ventanas secundarias (7)

  1. dale a tu botón de cerrar un fx: id, si aún no lo has hecho: <Button fx:id="closeButton" onAction="#closeButtonAction">
  2. 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.