JFreeChart: пользовательский график с всплывающей подсказкой при наведении курсора - PullRequest
0 голосов
/ 30 декабря 2018

У меня есть требование показать XyLineChart с динамическим добавлением данных.Я использовал настройщик диаграмм для чтения данных из БД с некоторой дополнительной логикой и добавления их в диаграмму.Но я не могу создать всплывающую подсказку для каждой точки данных на графике.Ниже приведен мой код для настройки.

Как правильно создать всплывающую подсказку при наведении мыши?

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();
        }
    }
}

1 Ответ

0 голосов
/ 07 января 2019

Спасибо, Петтер и Трашгод, помогли мне найти решение этой проблемы.Фактическая проблема заключается в том, что если мы добавляем новые данные с помощью настройщика, то новая точка данных отображается на графике, но соответствующая подсказка не генерируется, и карта, используемая для всплывающей подсказки, не будет обновляться в 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);
...