【问题标题】:Make a javafx stage the owner of a JDialog?让 javafx 阶段成为 JDialog 的所有者?
【发布时间】:2012-09-24 07:49:21
【问题描述】:

在 javafx 应用程序菜单项单击中显示包含 Jasper 报告的 JRViewer 的摆动 JDialog。但是即使在setModal(true) 之后,JDialog 也不是 MODAL,因为它不属于 javafx 阶段。如何使 javafx 阶段成为JDialog 的所有者?或者如何在 javafx 舞台、场景中显示 Jasper 报告?

【问题讨论】:

  • 您不能让 JavaFX 组件成为 Swing 组件的所有者。

标签: javafx jdialog


【解决方案1】:

不要使用 JDialog。在 JavaFX 中,您使用 Stages。将您的 Jasper 报告放入 Scene,将场景放入舞台。我认为你不能将 Swing 组件放在 JavaFX 组件中,所以你必须检查这个链接:Integrating JavaFX into Swing Applications

制作 JavaFX 对话框的代码:

            Stage stage = new Stage();
            stage.setTitle("Title");
            stage.setResizable(false);
            stage.initModality(Modality.APPLICATION_MODAL);
            stage.initOwner(primaryStage);
            stage.initStyle(StageStyle.UTILITY);

            (...)

            Scene scene = new Scene(...);
            stage.setScene(scene);

在上面的代码中,舞台的行为与对话框完全相同。

还要检查这个:

How to create a JavaFX dialog?

Hello World, JavaFX Style

【讨论】:

    【解决方案2】:

    回到第一个(基本)问题:不可能让 Stage 成为 JDialog 的所有者。但是,设置好 SwingNode 的内容后

    swingNode.setContent(xxx);
    

    在找到 (AWT-) Frame 或 (AWT-) Dialog 之前,您可以获取 xxx 的父级(也可能是 xxx 的父级的父级...)。在 SwingNode 的情况下,它是一个 JLightweightFrame。您可以使用此对象作为所有者来创建您的 JDialog。

    但是,我认为 JavaFX SwingNode 机制中存在错误。如果您将 JDialog 设置为模态 (setModal(true)),则 JDialog 在功能上显示为模态,但它可能会出现在主 (JavaFX) 窗口的后面。仍然可以移动主窗口,把它放在前面等等,如果有一个模态对话框,这应该是不可能的。但这是另一个话题。

    【讨论】:

      【解决方案3】:

      在 javafx (jdk 1.8>) 阶段查看 Jasper 报告

      JasperPrint jp = JasperFillManager.fillReport(reportsource, params,getCon());
      
                      SwingNode swingNode = new SwingNode();
                      swingNode.setContent(new JRViewer(jp));
      
                      AnchorPane anchorPane = new AnchorPane();
      
                      AnchorPane.setTopAnchor(swingNode,0.0);
                      AnchorPane.setBottomAnchor(swingNode,0.0);
                      AnchorPane.setLeftAnchor(swingNode,0.0);
                      AnchorPane.setRightAnchor(swingNode,0.0);
      
                      anchorPane.getChildren().add(swingNode);
                      Scene scene = new Scene(anchorPane);
                      Stage stage = new Stage();
                              stage.setHeight(550);
                              stage.setWidth(600);
                              stage.setAlwaysOnTop(true);
                              stage.setScene(scene);
                              stage.showAndWait();
      

      【讨论】:

      • 谢谢,可以了,但是刷新报表元素有问题,有什么解决办法吗?
      • 什么样的问题?你能解释一下吗?
      • 在父应用程序或子窗口中出现屏幕更新问题。有时整个窗口都会变黑。
      【解决方案4】:

      另外,如何在 javafx 舞台、场景中显示 Jasper 报告?

      Output HTML from your Jasper report 并在 JavaFX WebView 中加载报告。

      让 javafx 阶段成为 JDialog 的所有者?

      我认为这是不可能的。相反,应该使您的应用程序成为 Swing 应用程序并将您的 JavaFX 内容托管在 Swing JFrame 内的 JFXPanel 内。那么你就没有舞台,JDialog 的所有者可以是托管 JFXPanel 的 JFrame。

      【讨论】:

        【解决方案5】:

        现在可以做到了
        您现在需要的是安装 jdk 8
        因为javafx中的swing内容是在jdk8中引入的

        @FXML
        private SwingNode swingNode;
        ...
        JasperPrint jasperPrint = JasperFillManager.fillReport(FileName, hash, connect);
        swingNode.setContent(new JRViewer(jasperPrint));
        

        oracle 也为此添加教程
        接下来你可以点击这个链接
        oracle tutorial embed swing in javaFX

        【讨论】:

          【解决方案6】:

          我在 JavaFX 8 中编写了一个 JasperReports 打印预览阶段类。它是纯 JavaFX 代码,不需要使用SwingNode 类。

          与JRViewer相比,它不支持链接和零件,但打印预览窗口无论如何都不需要它。另一方面,代码要短得多,因此很容易理解并进一步满足每个人的需求。

          这个类的源代码在GitHub repository免费提供。

          【讨论】:

            猜你喜欢
            • 1970-01-01
            • 1970-01-01
            • 1970-01-01
            • 2016-08-29
            • 1970-01-01
            • 1970-01-01
            • 2010-10-07
            • 2014-03-22
            • 1970-01-01
            相关资源
            最近更新 更多