Presta atención ya que en esta sección hallarás el arreglo que buscas.
Solución:
La solución alternativa de @eckig o @jewelsea funciona bastante bien. Pero yo usaría algo como esto:
// Somewhere in code
Dialog> dialog = new Dialog<>();
Window window = dialog.getDialogPane().getScene().getWindow();
window.setOnCloseRequest(event -> window.hide());
No conozco ninguna restricción de este uso, pero funcionó para mí. Y recomiendo inicializar la ventana justo después de la inicialización del diálogo, como arriba.
Para solucionar esto, puede agregar un botón de cierre oculto al cuadro de diálogo.
import javafx.application.Application;
import javafx.scene.*;
import javafx.scene.control.*;
import javafx.stage.Stage;
public class DialogClosure extends Application
@Override
public void start(Stage stage) throws Exception
Button openDialog = new Button("Open Dialog");
openDialog.setOnAction(event ->
Dialog dialog = new Dialog();
dialog.getDialogPane().getButtonTypes().add(ButtonType.CLOSE);
Node closeButton = dialog.getDialogPane().lookupButton(ButtonType.CLOSE);
closeButton.managedProperty().bind(closeButton.visibleProperty());
closeButton.setVisible(false);
dialog.showAndWait();
);
stage.setScene(new Scene(openDialog));
stage.show();
public static void main(String[] args)
launch(args);
Luego, el cuadro de diálogo cumple con su requisito de poder cerrarse a través del icono de cierre de la ventana del sistema nativo de ventanas, así como con el requisito del diálogo JavaFX de incluir un botón de cierre en el cuadro de diálogo para que funcione el icono de cierre.
Alternativamente, podría usar un escenario con showAndWait en lugar de un diálogo. Un escenario sin ningún botón incluido se puede cerrar con el icono de cerrar ventana del sistema de ventanas.
Para citar los Api Docs:
Los diálogos de JavaFX solo se pueden cerrar ‘anormalmente’ (como se definió anteriormente) en dos situaciones:
Cuando el cuadro de diálogo solo tiene un botón, o
Cuando el cuadro de diálogo tenga varios botones, siempre que uno de ellos cumpla con uno de los siguientes requisitos:
- El botón tiene un ButtonType cuyo ButtonData es de tipo ButtonData.CANCEL_CLOSE.
- El botón tiene un ButtonType cuyo ButtonData devuelve true cuando se llama a ButtonData.isCancelButton().
…
Entonces agregue al menos un botón o varios botones, y uno de ellos es del tipo ButtonData.CANCEL_CLOSE
por ejemplo:
Dialog dialog = new Dialog<>();
dialog.getDialogPane().getButtonTypes().add(new ButtonType("Got it!", ButtonData.CANCEL_CLOSE));
dialog.setContentText("test");
dialog.showAndWait();
Editar:
Este comportamiento se implementa en javafx.scene.control.FXDialog.requestPermissionToClose(Dialog>)
pero el verdadero FXDialog
se muestra es HeavyweightDialog
que no es una API pública, por lo que no es realmente un punto de extensión.
Reseñas y calificaciones de la guía
Acuérdate de que te brindamos la opción de esclarecer tu experiencia .