为了账号安全,请及时绑定邮箱和手机立即绑定

JFreeChart MouseListener无法解析图表元素

JFreeChart MouseListener无法解析图表元素

PIPIONE 2019-11-04 13:16:12
我有堆叠的条形图,我希望能够在其中选择单个条形。但是ChartMouseListener不会将ChartMouseEvent解析为相应的ChartEntity。这是听众的片段:    public void chartMouseClicked(ChartMouseEvent event){        ChartEntity entity = event.getEntity();        if(entity != null && (entity instanceof XYItemEntity) ){            XYItemEntity item = (XYItemEntity)entity;            renderer.select(item.getSeriesIndex(), item.getItem());            return;        }        // deselect        renderer.select(-1,-1);    }问题是当我显然单击某些栏时event.getEntity()返回null。请注意,并非所有的酒吧失败。我越靠近图表的右端,坐标移位就越明显。快照下面显示出选择的酒吧实际上出现点击它外面时。我SWT复合内使用JFreeChart的。任何人都可以确认这是错误的行为还是有解决方法?
查看完整描述

3 回答

?
jeck猫

TA贡献1909条经验 获得超7个赞

好的,我发现了问题。在SWT中,有多个构造函数可以创建ChartComposite,大多数使用默认值来指定最小/最大宽度和高度。就我而言,只要将图表放大到DEFAULT_MAXIMUM_DRAW_WIDTH(800px)以上,坐标就会变得混乱。因此,解决方案是使用完整的构造函数并为您的显示指定相关边界。这很难破解...主要是由于缺乏适当的文档。


查看完整回答
反对 回复 2019-11-04
?
隔江千里

TA贡献1906条经验 获得超10个赞

从Swing运行时,示例性渲染器具有正确的几何形状,如下所示。我不确定SWT为何会出现问题,但是此结果可能会缩小搜索范围。

import java.awt.Color;

import java.awt.EventQueue;

import java.awt.Paint;

import java.util.Random;

import javax.swing.JFrame;

import org.jfree.chart.ChartMouseEvent;

import org.jfree.chart.ChartMouseListener;

import org.jfree.chart.ChartPanel;

import org.jfree.chart.JFreeChart;

import org.jfree.chart.axis.DateAxis;

import org.jfree.chart.axis.DateTickMarkPosition;

import org.jfree.chart.axis.NumberAxis;

import org.jfree.chart.entity.ChartEntity;

import org.jfree.chart.entity.XYItemEntity;

import org.jfree.chart.event.RendererChangeEvent;

import org.jfree.chart.plot.XYPlot;

import org.jfree.chart.renderer.xy.StackedXYBarRenderer;

import org.jfree.chart.renderer.xy.StandardXYBarPainter;

import org.jfree.data.time.Day;

import org.jfree.data.time.Hour;

import org.jfree.data.time.TimeTableXYDataset;

import org.jfree.data.xy.TableXYDataset;


public class StackedChartSwing {


    private ChartPanel panel;

    private StackedRenderer renderer;

    private Color[] colors = new Color[]{

        new Color(230, 240, 255),

        new Color(240, 255, 240),

        new Color(255, 255, 255),

        new Color(255, 255, 240),

        new Color(255, 240, 240),

        new Color(240, 240, 240)

    };


    public StackedChartSwing() {

        JFreeChart chart = createStackedChart(createStackedDataset());

        panel = new ChartPanel(chart);

        panel.addChartMouseListener(new ThisMouseListener());

    }


    private JFreeChart createStackedChart(TableXYDataset tablexydataset) {

        DateAxis dateaxis = new DateAxis();

        dateaxis.setTickMarkPosition(DateTickMarkPosition.MIDDLE);

        NumberAxis numberaxis = new NumberAxis("Event counts");

        renderer = new StackedRenderer();

        XYPlot plot = new XYPlot(tablexydataset, dateaxis, numberaxis, renderer);

        plot.setBackgroundPaint(Color.white);

        plot.setDomainGridlinePaint(Color.lightGray);

        plot.setDomainGridlinesVisible(true);

        plot.setRangeGridlinesVisible(true);

        plot.setRangeGridlinePaint(Color.lightGray);


        JFreeChart chart = new JFreeChart(null, plot);

        chart.setBackgroundPaint(Color.white);

        chart.setBorderVisible(false);

        chart.setBorderPaint(null);


        return chart;

    }


    class StackedRenderer extends StackedXYBarRenderer {


        int selectedRow = -1, selectedCol = -1;


        public StackedRenderer() {

            setDrawBarOutline(true);

            setBarPainter(new StandardXYBarPainter());

            setShadowVisible(false);

            setSeriesPaint(0, Color.blue);

            setMargin(0.2);

        }


        public void select(int row, int col) {

            selectedRow = row;

            selectedCol = col;

            notifyListeners(new RendererChangeEvent(this));

        }


        @Override

        public Paint getItemPaint(final int row, final int col) {

            if (row == selectedRow && col == selectedCol) {

                return Color.pink;

            }

            return colors[row];

        }

    }


    class ThisMouseListener implements ChartMouseListener {


        @Override

        public void chartMouseMoved(ChartMouseEvent event) {

        }


        @Override

        public void chartMouseClicked(ChartMouseEvent event) {

            ChartEntity entity = event.getEntity();

            if (entity != null && (entity instanceof XYItemEntity)) {

                XYItemEntity item = (XYItemEntity) entity;

                renderer.select(item.getSeriesIndex(), item.getItem());

                return;

            }

            // deselect

            renderer.select(-1, -1);

        }

    }


    private TableXYDataset createStackedDataset() {

        Random random = new Random(0);

        TimeTableXYDataset ds = new TimeTableXYDataset();

        Day day = new Day();

        for (int i = 0; i < 24; i++) {

            Hour hour = new Hour(i, day);

            ds.add(hour, random.nextInt(20), "A");

            ds.add(hour, random.nextInt(20), "B");

            ds.add(hour, random.nextInt(20), "C");

            ds.add(hour, random.nextInt(20), "D");

            ds.add(hour, random.nextInt(20), "E");

            ds.add(hour, random.nextInt(20), "F");

        }


        return ds;

    }


    private void display() {

        JFrame f = new JFrame("Test");

        f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        f.add(panel);

        f.pack();

        f.setLocationRelativeTo(null);

        f.setVisible(true);

    }


    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {


            @Override

            public void run() {

                new StackedChartSwing().display();

            }

        });

    }

}


查看完整回答
反对 回复 2019-11-04
?
慕森卡

TA贡献1806条经验 获得超8个赞

摆动不是这里的问题。问题在JFreeChart的SWT版本中。实际上,最初打开时,一切正常。但是,一旦您调整了主机框架的大小,事情就会变得疯狂。它必须非常简单,就好像图表不知道已调整大小一样。但是它确实可以正确绘制,只是渲染器变得无用。我需要这些东西才能在Eclipse RCP应用程序中工作,如果无法解决,所有库都将变为无效是多么可惜的事情。

查看完整回答
反对 回复 2019-11-04
  • 3 回答
  • 0 关注
  • 773 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信