【问题标题】:JFreeChart: custom chart with tooltip on mouseoverJFreeChart:鼠标悬停时带有工具提示的自定义图表
【发布时间】:2019-01-07 15:21:49
【问题描述】:

我需要显示一个动态添加数据的 XyLineChart。我已经使用图表定制器从 db 中读取数据,并添加一些额外的逻辑并将其添加到图表中。但我无法在鼠标悬停时为图表上的每个数据点创建工具提示。以下是我的定制器代码。

在鼠标悬停时创建工具提示的正确方法是什么?

public class MyChartCustomizer extends JRAbstractChartCustomizer{

    @Override
    public void customize(JFreeChart chart, JRChart jrChart) {
        XyPlot plot= chart.getXyPlot;
        XYSeriesCollection ds =  (XYSeriesCollection) plot.getDataset();
        XYSeries x1 = new XYSeries("C 1", true, true);

        x1.add(10,20);
        XYBarRenderer ren = (XYBarRenderer) plot.getRenderer();
        plot.setRenderer(ren);
        ren.setSeriesToolTipGenerator(0, new XYToolTipGenerator() {
            @Override
            public String generateToolTip(XYDataset arg0, int arg1, int arg2) {
                return "C 1";
            }
            });
            ren.setToolTipGenerator(new XYToolTipGenerator() {
                @Override
                public String generateToolTip(XYDataset arg0, int arg1, int arg2)                   {
                    return "C 1";
                }
            });
            chart.fireChartChanged();
        }
    }
}

【问题讨论】:

  • 这不是图表本身的功能。封闭的ChartPanelgetToolTipText() 中处理这个问题。在桌面环境之外,您可能会查看合适的标签生成器。
  • 我们可以自定义chartPanel工具Tiptext吗?当我使用图表自定义时,我无法访问图表面板。是否有可能你可以给我一些代码示例来自定义工具提示文本..请注意我正在添加图表自定义器类中的数据..
  • 除非封闭的ChartPanel 调用getToolTipText(),否则您的自定义工具提示文本将永远不会显示。你如何显示你的报告?你能添加一个像this这样的标签生成器吗?
  • 我用 xyline 图表(空图表)设计了报告并配置了图表定制器。我的问题中给出了图表定制器。在定制器类中,我无法获取 chartPanel 对象,也不确定如何为其生成工具提示。由于我需要动态生成 SQL,因此获取数据并将其设置为图表。我还自定义图表标签系列颜色顺序...
  • 我正在将报告部署到 jasper 服务器并使用自定义输入控件运行相同的报告。因此基于输入控件生成 sql 查询。这就是我设计带有图表的空白报告并部署到 jasper 服务器的原因。使用自定义数据源和定制器,我正在渲染 100% 动态生成的图表。

标签: java jasper-reports jfreechart


【解决方案1】:

感谢 Petter 和 Trashgod 帮助我找到解决此问题的方法。 实际问题是,如果我们使用定制器添加新数据,那么新数据点会显示在图表上,但不会生成尊重的工具提示,并且用于工具提示的地图不会在 html 代码上更新。由于我必须根据要求使用 jasper 服务器,因此我实现了以下工作,其他方法将简单地使用 jfreechart API 生成带有地图的图表图像并显示在 jsp 页面上(不需要报告设计......).. 以下是我实现这个的方式。

我使用以下代码生成了 jasperserver/jasper studio 创建图表的相同图表。这给了我在内部创建的相同图表,我为工具提示创建地图并将其作为参数传递给浏览器,并使用 javascript 函数插入带有图表图像的新地图 html 代码。

            XYSeriesCollection xyDataSet = new XYSeriesCollection();

        JFreeChart chart = ChartFactory.createXYLineChart(
                cur_chart.getTitle(),
                cur_chart.getxLabel(), cur_chart.getyLabel(),
                xyDataSet,
                PlotOrientation.VERTICAL,
                true,
                true,
                false);

        String chartId = null;
        for ( Object  tt :  chart.getSubtitles()){
            if (tt instanceof TextTitle){
                chartId= ((TextTitle) tt).getText();
            }
        }

        XYPlot plot = chart.getXYPlot();


    //following code to set font size and color is required so that same chart with matching tooltip pixels can we generated. 
        LegendItemCollection legends =  plot.getLegendItems();


        List<JRSeriesColor> colors = new ArrayList<JRSeriesColor>();

        System.out.println("Customizer: "+ chartId);

        NumberAxis xAxis = (NumberAxis) plot.getDomainAxis();
        NumberAxis yAxis = (NumberAxis) plot.getRangeAxis();
        xAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());
        yAxis.setStandardTickUnits(NumberAxis.createIntegerTickUnits());

        Color trans = new Color(0xFF, 0xFF, 0xFF, 0);
        chart.setBackgroundPaint(trans);
        plot .setBackgroundPaint(trans);
        chart.getLegend().setBackgroundPaint(trans);

        chart.setTitle(cur_chart.getTitle());

        Font font3 = new Font("Dialog", Font.PLAIN, 10); 
        plot.getDomainAxis().setLabelFont(font3);
        plot.getRangeAxis().setLabelFont(font3);
        plot.getDomainAxis().setLabelPaint(Color.BLACK);
        plot.getRangeAxis().setLabelPaint(Color.BLACK);

    //some more code to add real time data to XyDataset, 


    ToolTipTagFragmentGenerator tooltipConstructor = new ToolTipTagFragmentGenerator() {
            public String generateToolTipFragment(String arg0) {
                String toolTip = " title = \"" + arg0.replace("\"", "") + "\"";
                return (toolTip);
            }
        };

        URLTagFragmentGenerator urlConstructor = new URLTagFragmentGenerator() {
            public String generateURLFragment(String arg0) {
                String address = " href=\"ControllerAddress\\methodName?"
                    + arg0.replace("\"", "") + "\"";
                return (address);
            }
        };



        ChartRenderingInfo info = new ChartRenderingInfo(
                new StandardEntityCollection());
       // BufferedImage bi  chart.createBufferedImage(272, 178, info); 
        TextTitle tt =  new TextTitle("chart1");
        tt.setFont(font3);
        chart.addSubtitle(tt);
        ChartUtilities.saveChartAsPNG(new File("/tmp/test.png"), chart, 500, 250, info);
    String map = ChartUtilities.getImageMap(cur_chart.getName(), info, tooltipConstructor, urlConstructor);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-05-11
    • 2014-04-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多