Para criar o Jasper Report no JavaFX 11, estou usando relatórios dinâmicos. Estou carregando o relatório no Swing Node, mas o relatório Jasper será exibido apenas se eu clicar na área do painel de pilhas e em todos os outros componentes visíveis apenas se passar o mouse sobre todos esses componentes. Os componentes e o conteúdo do relatório não são carregados instantaneamente, em vez de serem exibidos ao passar o mouse e o relatório é exibido ao rolar o painel Pilha.
Como esse foi o bug no Java 8 e parece estar resolvido, mas no Java 11 também estou recebendo o mesmo problema.
Atualizar
Como não estou recebendo nenhuma resposta e, conforme sugerido pelo kleopatra, criei um código reproduzível mínimo. Por favor, olhe para isso.
JavaFxJasperReportsDemo.java
package demo;
import java.util.ArrayList;
import java.util.List;
import javax.swing.SwingUtilities;
import javafx.application.Application;
import javafx.application.Platform;
import javafx.embed.swing.SwingNode;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import javafx.stage.WindowEvent;
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder;
import net.sf.dynamicreports.report.builder.DynamicReports;
import net.sf.dynamicreports.report.builder.column.Columns;
import net.sf.dynamicreports.report.builder.component.Components;
import net.sf.dynamicreports.report.builder.datatype.DataTypes;
import net.sf.dynamicreports.report.constant.HorizontalTextAlignment;
import net.sf.dynamicreports.report.exception.DRException;
import net.sf.jasperreports.engine.JasperPrint;
import net.sf.jasperreports.swing.JRViewer;
public class JavaFxJasperReportsDemo extends Application{
@FXML
private StackPane stackPane;
public void start(Stage stage) throws Exception{
try{
System.out.println("Hello");
Parent root = FXMLLoader.load(getClass().getResource("/FXMLJavaFXJasperReportsDemo.fxml"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.setTitle("Java FX Demo");
stage.show();
stage.setOnCloseRequest(new EventHandler<WindowEvent>() {
public void handle(WindowEvent arg0) {
Platform.exit();
}
});
}
catch (Exception e){
throw e;
}
}
@FXML
public void loadReport(ActionEvent event) {
JasperReportBuilder report = DynamicReports.report();
List<DemoPOJO> lstDemoPOJOs=new ArrayList<DemoPOJO>();
DemoPOJO demoPOJO=new DemoPOJO();
demoPOJO.setName("ABC");
demoPOJO.setCity("Delhi");
lstDemoPOJOs.add(demoPOJO);
demoPOJO = new DemoPOJO();
demoPOJO.setName("XYZ");
demoPOJO.setCity("Agra");
lstDemoPOJOs.add(demoPOJO);
report
.columns(
Columns.columnRowNumberColumn("S No"),
Columns.column("Name", "name", DataTypes.stringType()),
Columns.column("Address", "city", DataTypes.stringType())
).title(
Components.text("Demo Java Fx Jasper Reports").
setHorizontalTextAlignment(HorizontalTextAlignment.CENTER))
.pageFooter(Components.pageXofY())
.setDataSource(lstDemoPOJOs);
try {
JasperPrint jasperPrintReport=report.toJasperPrint();
SwingNode swingNode = new SwingNode();
AnchorPane.setTopAnchor(swingNode,0.0);
AnchorPane.setBottomAnchor(swingNode,0.0);
AnchorPane.setLeftAnchor(swingNode,0.0);
AnchorPane.setRightAnchor(swingNode,0.0);
JRViewer jrViewer= new JRViewer(jasperPrintReport);
SwingUtilities.invokeLater(() ->swingNode.setContent(jrViewer)
);
stackPane.getChildren().add(swingNode);
} catch (DRException e) {
e.printStackTrace();
}
}
public static void main(String[] args){
System.out.println("Hello Main");
try{
launch(args);
}
catch (Exception e){
e.printStackTrace();
}
}
}
DemoPOJO.java
package demo;
public class DemoPOJO {
String name;
String city;
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCity() {
return city;
}
public void setCity(String city) {
this.city = city;
}
}
FXMLJavaFXJasperReportsDemo.fxml
<?xml version="1.0" encoding="UTF-8"?>
<?import javafx.scene.control.Button?>
<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.AnchorPane?>
<?import javafx.scene.layout.StackPane?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="561.0" prefWidth="745.0" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="demo.JavaFxJasperReportsDemo">
<children>
<Label layoutX="345.0" layoutY="24.0" text="Java FX Demo Application" />
<StackPane fx:id="stackPane" layoutX="14.0" layoutY="120.0" prefHeight="392.0" prefWidth="722.0" />
<Button layoutX="62.0" layoutY="68.0" mnemonicParsing="false" onAction="#loadReport" text="Load Report" />
</children>
</AnchorPane>
As dependências que estou usando são: -
<dependency>
<groupId>net.sourceforge.dynamicreports</groupId>
<artifactId>dynamicreports-core</artifactId>
<version>6.1.0</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-controls</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-fxml</artifactId>
<version>11</version>
</dependency>
<dependency>
<groupId>javax.xml.bind</groupId>
<artifactId>jaxb-api</artifactId>
<version>2.2.11</version>
</dependency>
<dependency>
<groupId>org.openjfx</groupId>
<artifactId>javafx-swing</artifactId>
<version>11-ea+24</version>
</dependency>
Resultado
Depois de clicar no botão carregar relatório, apenas um ícone de salvamento fica visível e nenhum relatório é visível.
Depois de clicar na área do painel Pilha agora, o Relatório fica visível.
Depois de passar o mouse sobre outro ícone, agora o ícone Imprimir fica visível.
Depois de passar o mouse sobre outros ícones, eles ficam visíveis um a um.
fonte
jbsdk11b125_osx_x64
e não consegui reproduzir o problema. Mostra o conteúdo completo diretamente. Embora eu esteja recebendo um aviso Carregando documento FXML com a API JavaFX da versão 11.0.1 pelo tempo de execução JavaFX da versão 10.0.2-internal ...org.openjfx:javafx-swing
, por exemplo11
? 3) Usando o Java 11.0.5, Maven 3.6.2 e o plugorg.openjfx:javafx-maven-plugin:0.0.4
- in, ele funciona sem problemas de renderização (o relatório é exibido depois de clicar noLoad Report
botão). O aplicativo é iniciado commvn clean javafx:run
.Respostas:
Após verificar o wiki do OpenJDK para sinalizadores de depuração do OpenJFX, você pode tentar seguir.
inclua na seção de construção da
pom.xml
opção uma JVM para OpenJFXexecutar o aplicativo com
mvn javafx:run
ele relatará a configuração do Prism detectadasaída no meu sistema
está usando um renderizador acelerado por hardware
Loading ES2 native library ... prism_es2
É possível forçar o uso do renderizador de software. Mudança no
pom.xml
a saída é então
Está usando o renderizador de software
Fallback to Prism SW pipeline
.versões usadas para os testes acima:
JDK
Maven
fonte
java -version
você usa? Você tentou executar o lançamento em11
vez11-ea+24
do pluginorg.openjfx:javafx-swing
?