【问题标题】:JavaFX Stage ModalityJavaFX 阶段模态
【发布时间】:2021-06-10 12:46:56
【问题描述】:

我正在尝试制作一个通过舞台打开的模态窗口。这是代码:

Stage stage = new Stage();                               
Parent root = fxmlLoader.load();
stage.setScene(new Scene(root));
stage.setTitle("Stuff");
stage.initModality(Modality.WINDOW_MODAL);
stage.show();

但没有实际成功,尽管我能够单击底层窗口。 有什么我做错了吗?

编辑: 我早些时候查看了 Oracle 网站上的文档,但可以找到解决方案,因为显示的窗口的行为与模态窗口的预期并不接近。 我在这个项目中使用的 JDK 是 1.8.0_40

编辑 2: 根据ItachiUchiha的要求,句柄内的代码

Boolean confirmacion = MessageUtil.ventanaConfirmacion(RecursosUtil.creaTextoProperties("confNoRealizar"));

if (confirmacion) {
    try {
        TbInspeccion inspeccionSeleccionada = (TbInspeccion) getTableRow().getItem();

        URL location = cargaURLFXML(OBSERVACIONESFXML);
        FXMLLoader fxmlLoader = cargaFXML(location);

        stage = new Stage();
        Parent root = fxmlLoader.load();
        stage.setScene(new Scene(root));
        stage.setTitle("Observaciones");

        ObservacionesController controller = (ObservacionesController) fxmlLoader.getController();
        controller.setStage(stage);
        controller.setInspeccion(inspeccionSeleccionada);
        controller.setProvider(provider);
        controller.setTablaPrincipal(tablaPrincipal);

        stage.initModality(Modality.APPLICATION_MODAL);
        stage.show();
    } catch (IOException ex) {
        Exceptions.printStackTrace(ex);
    }
}

感谢您的时间和帮助。

【问题讨论】:

    标签: java javafx


    【解决方案1】:

    替换

    stage.initModality(Modality.WINDOW_MODAL);
    

    stage.initModality(Modality.APPLICATION_MODAL);
    

    前几块如下:

    定义一个模式窗口,阻止事件被传递到它的 整个所有者窗口层次结构。

    而后者:

    定义一个模式窗口,阻止事件被传递到任何 其他应用程序窗口。

    来源:https://docs.oracle.com/javase/8/javafx/api/javafx/stage/Modality.html

    根据您想要实现上述行为的原因,您可能想要使用 JDK 8 Update 40 中提供的JavaFX 8 Dialog

    【讨论】:

    • 我也尝试了 APPLICATION_MODAL,但仍然表现得很奇怪。在提出问题之前,我检查了文档。但找不到解决办法。
    【解决方案2】:

    您需要添加stage.initOwner()Modality.WINDOW_MODAL 以识别所有者:

    stage.initOwner(primaryStage);
    stage.initModality(Modality.WINDOW_MODAL);
    

    或者,您可以在没有所有者的情况下使用 Modality.APPLICATION_MODAL

    【讨论】:

    • 我都试过了,但窗口仍然没有显示“模态”行为。动作还是怪怪的。 :(。感谢您的快速回复。
    • 您在哪里添加此代码?是在显示primary stage 之前吗?在按钮的动作事件中?
    • TableCell 中按钮句柄部分的代码
    • 如何在 Action Handler 中获取对当前阶段的引用?
    • 我有一个 TableView,我在创建它们后将所有列添加到其中。
    【解决方案3】:

    替换stage.initModality(Modality.WINDOW_MODAL);
    stage.initModality(Modality.APPLICATION_MODAL);

    您还必须替换 stage.show();
    stage.showAndWait();

    【讨论】:

      猜你喜欢
      • 2015-02-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-05-29
      • 2012-10-11
      • 2016-08-29
      相关资源
      最近更新 更多