2016-07-25 3 views
1

DynamicReports APIを使用して、Javaアプリケーション(表とグラフ)の結果を表示するPDFレポートを作成しています。 私が表示しなければならないチャートの1つは3D Surface Plotで、jzy3d 0.9.0を使用してビルドされています。ここでDynamicReportsを使用してjzy3dグラフを保存します。

は私のコードです:

import static net.sf.dynamicreports.report.builder.DynamicReports.*; 
import net.sf.dynamicreports.examples.Templates; 
import net.sf.dynamicreports.examples.complex.invoice.InvoiceDesign; 
import net.sf.dynamicreports.examples.complex.sales.SalesDesign; 
import net.sf.dynamicreports.jasper.builder.JasperReportBuilder; 
import net.sf.dynamicreports.report.constant.HorizontalImageAlignment; 
import net.sf.dynamicreports.report.constant.HorizontalTextAlignment; 
import net.sf.dynamicreports.report.constant.PageType; 
import net.sf.dynamicreports.report.constant.VerticalImageAlignment; 
import net.sf.dynamicreports.report.constant.VerticalTextAlignment; 
import net.sf.dynamicreports.report.builder.chart.PieChartBuilder; 
import net.sf.dynamicreports.report.builder.component.ComponentBuilder; 
import net.sf.dynamicreports.report.builder.component.ComponentBuilders; 
import net.sf.dynamicreports.report.builder.component.TextFieldBuilder; 
import net.sf.dynamicreports.report.builder.style.FontBuilder; 
import net.sf.dynamicreports.report.builder.style.StyleBuilder; 
import net.sf.dynamicreports.report.constant.PageOrientation; 
import net.sf.dynamicreports.report.datasource.DRDataSource; 
import net.sf.jasperreports.engine.JRDataSource; 
import net.sf.dynamicreports.jasper.builder.export.Exporters; 
import net.sf.dynamicreports.report.builder.column.TextColumnBuilder; 
import net.sf.dynamicreports.report.builder.component.HorizontalListBuilder; 
import javax.swing.JFrame; 
import com.fairdynamics.components.FDPalette; 
import com.fairdynamics.components.FDGlassPane; 
import com.fairdynamics.components.FDOptionPane; 
import fairdynamics.lyrica.UI_VisualAnalytics.UIRespondersHeatMap.HeatMapDetails; 
import javax.swing.ImageIcon; 
import org.jzy3d.maths.*; 
import org.jzy3d.plot3d.builder.*; 
import org.jzy3d.plot3d.builder.concrete.OrthonormalGrid; 
import org.jzy3d.colors.ColorMapper; 
import org.jzy3d.colors.colormaps.ColorMapRainbow; 
import org.jzy3d.plot3d.primitives.Shape; 
import org.jzy3d.chart.Chart; 
import org.jzy3d.plot3d.rendering.canvas.Quality; 
import org.jzy3d.chart.ChartLauncher; 
import org.jzy3d.plot3d.builder.Mapper; 

public class UI_ReportBuilder3 extends JasperReportBuilder{ 
    protected final FontBuilder font18 = stl.font("Roboto Light",false,false,18); 
    protected final FontBuilder font16 = stl.font("Roboto Light",false,false,16); 
    protected final FontBuilder font14 = stl.font("Roboto Light",false,false,14); 
    protected final FontBuilder font12 = stl.font("Roboto Light",false,false,12); 
    protected final FontBuilder font10 = stl.font("Roboto Light",false,false,10); 
    protected final StyleBuilder titleStyle = stl.style(font12).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder mainTitleStyle = stl.style(font18).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder subTitleStyle = stl.style(font14).setVerticalTextAlignment(VerticalTextAlignment.TOP).setForegroundColor(FDPalette.primaryColor); 
    protected final StyleBuilder footerStyle = stl.style(font10).setVerticalTextAlignment(VerticalTextAlignment.MIDDLE).setForegroundColor(FDPalette.secondaryText); 
    protected final StyleBuilder colStyle = stl.style(font12).setVerticalTextAlignment(VerticalTextAlignment.MIDDLE); 

    public UI_ReportBuilder3() {   
     try{ 
      this 
      .setTemplate(Templates.reportTemplate) 
      .setPageFormat(PageType.A4,PageOrientation.PORTRAIT) 
      .setPageMargin(margin(40)) 
      .pageFooter(
        cmp.text("Footer").setStyle(footerStyle).setHorizontalTextAlignment(HorizontalTextAlignment.CENTER) 
       ) 
      .title(
        cmp.horizontalList().add(
         cmp.text("TITLE").setStyle(mainTitleStyle).setHorizontalTextAlignment(HorizontalTextAlignment.LEFT) 
        ) 
        .setFixedHeight(32) 
       ) 
      .summary(
        cmp.multiPageList(cmp.image(createHeatMap().screenshot()) 
         ) 
       ) 
      .show() 
      ; 
     }catch(Exception e){ 
      e.printStackTrace(); 
     } 
    } 


    private org.jzy3d.chart.Chart createHeatMap(){   
     // Define a function to plot 
     Mapper mapper = new Mapper() { 
      public double f(double x, double y) { 
       return 10 * Math.sin(x/10) * Math.cos(y/20) * x; 
      } 
     }; 

     // Define range and precision for the function to plot 
     Range range = new Range(-150, 150); 
     int steps = 50; 

     // Create a surface drawing that function 
     org.jzy3d.plot3d.primitives.Shape surface = Builder.buildOrthonormal(new OrthonormalGrid(range, steps, range, steps), mapper); 
     surface.setColorMapper(new ColorMapper(new ColorMapRainbow(), surface.getBounds().getZmin(), surface.getBounds().getZmax(), new org.jzy3d.colors.Color(1, 1, 1, .5f))); 
     surface.setFaceDisplayed(true); 
     surface.setWireframeDisplayed(false); 
     surface.setWireframeColor(org.jzy3d.colors.Color.BLACK); 

     // Create a chart and add the surface 
     org.jzy3d.chart.Chart chart = new org.jzy3d.chart.Chart(Quality.Advanced); 
     chart.getScene().getGraph().add(surface); 

     return chart; 
    } 

} 

このコードは、私がchartを返す前にcreateHeatMap() から(結果的にチャートでフレームを開くことで表示)メソッドChartLauncher.openChart(chart)を呼び出す場合にのみ動作しますが、そうでないcreateHeatMap().screenshot()常にnullを返します。 しかし、自分のJavaアプリケーションでチャート自体を表示せずにこのチャートのPDFを作成してエクスポートする必要がある場合はどうすればいいですか?

注:可能であれば、私はそうでない場合、私は多くのコードが既に書かれており、テスト変更する必要がありますのでjzy3d 0.9.0なくjzy3d 0.9.1を使用することを好むだろう。

この方法でスクリーンショットをキャプチャすること
+0

はjava.awt.Imageに変換し、そのように渡しますか? –

+0

イメージに変換する必要はありますか?つまり、 'org.jzy3d.chart.Chart'クラスは' screenshot() 'メソッドを提供していますが、チャートが正しく表示されない場合はnullを返します。問題は、グラフを表示したくないということです。 – Roberto

+0

私はジャスパー報告書でのみjzy3dグラフの経験はありません。 jasperレポートの観点から、Imageを渡す必要があります。そのためジャスパーレポートの問題を切り分け、チャートのjava.awt.Imageを返すメソッドを作成することに集中することを提案しました(スクリーンショット、g2、ファイルに保存しますか?)、jzy3dを使ってこれを行う最善の方法はわかりません。 –

答えて

0

Chart c = AWTChartComponentFactory.chart(Quality.Nicest,org.jzy3d.chart.factories.IChartComponentFactory.Toolkit.offscreen); 
c.screenshot(); 
BufferedImage i = ((OffscreenCanvas)c.getCanvas()).getRenderer()).getLastScreenshotImage(); 
関連する問題