在javafx应用程序菜单项单击中显示包含Jasper Report JDialog
的摆动JRViewer
。但是JDialog
即使在setModal(true)
之后也不是MODAL,因为它不归javafx阶段所有。如何让javafx阶段成为JDialog
的所有者?或者如何在javafx舞台场景中显示Jasper报告?
答案 0 :(得分:2)
不要使用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);
在上面的代码中,舞台的行为与对话框完全相同。
同时检查:
答案 1 :(得分:2)
回到第一个(基础)问题:不可能使舞台成为JDialog的所有者。但是,在设置SwingNode的内容
之后swingNode.setContent(xxx);
你可以获得xxx的父级(也可能是xxx父级的父级),直到找到(AWT-)帧或(AWT-)对话框。在SwingNode的情况下,它是一个JLightweightFrame。您可以使用此对象作为所有者来创建JDialog。
但是,我认为JavaFX SwingNode机制中存在一个错误。 JDialog在功能上是模态的,如果你将其设置为模态(setModal(true)
),但它可能出现在主(JavaFX)窗口的后面。它仍然可以移动主窗口,将它放在前面等等,如果有模态对话框,那么应该是不可能的。但这是另一个话题。
答案 2 :(得分:1)
要在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();
答案 3 :(得分:0)
或者如何在javafx舞台场景中显示Jasper报告?
Output HTML from your Jasper report并在JavaFX WebView中加载报告。
让javafx阶段成为JDialog的所有者吗?
我不认为这是可能的。应该做的是使您的应用程序成为Swing应用程序并将您的JavaFX内容托管在Swing JFrame内的JFXPanel内。那么你没有Stage,JDialog的所有者可以是托管JFXPanel的JFrame。
答案 4 :(得分:0)
现在可以这样做了
你现在需要的是安装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
答案 5 :(得分:0)
我在JavaFX 8中编写了一个JasperReports打印预览阶段类。它是一个纯JavaFX代码,不需要使用SwingNode类。
与JRViewer相比,它不支持链接和部件,但打印预览窗口无论如何都不需要它。另一方面,代码更短,更短,因此易于理解并进一步满足每个人的需求。
此课程的源代码可在GitHub repository免费获取。