Saltar al contenido

javafx.scene.control.Diálogo no se cierra al presionar “x”

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:

  1. Cuando el cuadro de diálogo solo tiene un botón, o

  2. Cuando el cuadro de diálogo tenga varios botones, siempre que uno de ellos cumpla con uno de los siguientes requisitos:

    1. El botón tiene un ButtonType cuyo ButtonData es de tipo ButtonData.CANCEL_CLOSE.
    2. 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_CLOSEpor 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 .

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *