Cómo crear una ventana modal en JavaFX 2.1


No sé cómo crear una ventana modal en JavaFX. Básicamente tengo selector de archivos y quiero hacerle una pregunta al usuario cuando seleccione un archivo. Necesito esta información para analizar el archivo, por lo que la ejecución debe esperar la respuesta.

He visto esta pregunta, pero no he sido capaz de averiguar cómo implementar este comportamiento.

Author: fabian, 2012-05-07

3 answers

Aquí está enlace a una solución Que creé anteriormente para los diálogos modales en JavaFX 2.1 La solución crea una etapa modal encima de la etapa actual y actúa sobre los resultados del diálogo a través de controladores de eventos para los controles del diálogo.

Update

La solución vinculada anterior utiliza un enfoque de controlador de eventos con fecha para tomar medidas después de que se descartara un diálogo. Ese enfoque era válido para las implementaciones pre-JavaFX 2.2. Para JavaFX 8 + no hay necesidad de evento los instructores, en cambio, usan la nueva etapa showAndWait() método. Por ejemplo:

Stage dialog = new Stage();

// populate dialog with controls.
...

dialog.initOwner(parentStage);
dialog.initModality(Modality.APPLICATION_MODAL); 
dialog.showAndWait();

// process result of dialog operation. 
... 

Tenga en cuenta que, para que las cosas funcionen como se espera, es importante inicializar al propietario de la Etapa y inicializar la modalidad de la Etapa a WINDOW_MODAL o APPLICATION_MODAL.

Hay algunos diálogos de interfaz de usuario estándar de alta calidad en JavaFX 8 y ControlsFX , si se ajustan a sus requisitos, recomiendo usarlos en lugar de desarrollando el suyo propio. Esas clases integradas de JavaFX Dialog y Alert también tienen initOwner y initModality y showAndWait métodos, para que pueda establecer la modalidad para ellos como desee (tenga en cuenta que, de forma predeterminada, los cuadros de diálogo integrados son modales de aplicación).

 36
Author: jewelsea,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-13 00:13:59

En mi opinión esta no es una buena solución, porque la ventana padre está siempre activa.
Por ejemplo, si desea abrir la ventana como modal después de hacer clic en el botón...

private void clickShow(ActionEvent event) {
    Stage stage = new Stage();
    Parent root = FXMLLoader.load(
        YourClassController.class.getResource("YourClass.fxml"));
    stage.setScene(new Scene(root));
    stage.setTitle("My modal window");
    stage.initModality(Modality.WINDOW_MODAL);
    stage.initOwner(
        ((Node)event.getSource()).getScene().getWindow() );
    stage.show();
}

Ahora su nueva ventana es realmente modal - el padre es bloque. también puede utilizar

Modality.APPLICATION_MODAL
 60
Author: Krzysztof Szewczyk,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-02-16 14:18:44

Puede crear una aplicación como mi ejemplo. Esto es solo un solo archivo de la aplicación JavaFX.

public class JavaFXApplication1 extends Application {
    @Override
    public void start(Stage primaryStage) {
        Button btn = new Button();
        btn.setText("Say 'Hello World'");
        btn.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent event) {
                Stage stage; 
                stage = new Stage();

                final SwingNode swingNode = new SwingNode();

                createSwingContent(swingNode);

                StackPane pane = new StackPane();
                pane.getChildren().add(swingNode);

                stage.initModality(Modality.APPLICATION_MODAL);
                stage.setTitle("Swing in JavaFX");
                stage.setScene(new Scene(pane, 250, 150));
                stage.show();
            }
        });

        StackPane root = new StackPane();
        root.getChildren().add(btn);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private void createSwingContent(final SwingNode swingNode) {
        SwingUtilities.invokeLater(() -> {
            try {
                Path currentRelativePath = Paths.get("");
                String s = currentRelativePath.toAbsolutePath().toString();
                JasperDesign jasperDesign = JRXmlLoader.load(s + "/src/reports/report1.jrxml");

                String query = "SELECT * FROM `accounttype`";
                JRDesignQuery jrquery = new JRDesignQuery();
                jrquery.setText(query);
                jasperDesign.setQuery(jrquery);

                JasperReport jasperReport = JasperCompileManager.compileReport(jasperDesign);
                JasperPrint JasperPrint = JasperFillManager.fillReport(jasperReport, null, c);
                //JRViewer viewer = new JRViewer(JasperPrint);

                swingNode.setContent(new JRViewer(JasperPrint));
            } catch (JRException ex) {
                Logger.getLogger(AccountTypeController.class.getName()).log(Level.SEVERE, null, ex);
            }
        });
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
}
 -1
Author: user7182326,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-06 06:01:14