jfreechart应用--鼠标事件,popmenu,tooltip

工作过程中用到jfreechart输出两个图形,一个是柱状图,一个是曲线图。整理一下用到的几个点。

1.       创建chartpanel,之前在swt中使用jfreechart需要使用SWT_AWT进行swtawt的桥接。现在jfreechart中已经有直接在swt上创建的方式,类名ChartComposite。对于第1种方式有个鼠标双击事件响应的优点。

    ChartPanel chartPanel = new ChartPanel(chart, false);

Frame frame = SWT_AWT.new_Frame(this);

    frame.add(chartPanel);

    chartPanel.addChartMouseListener(new ChartMouseListener(){});

这里可以通过if(2 == event.getTrigger().getClickCount())进行双击相应。

2种方式的优点是可以将chartComposite直接当作swt中的composite,实质上也正是如此。在本文中,采用第二种方式。

2.       Tooltips,如果要在chart上显示tooltips,有两个地方需要设置,1在创建jfreechart时设置该chart是否产生tooltips2在构造chartComposite时,设置是否显示tooltips。注意chartcomposite有几个重载的构造函数。

3.       界面语言本地化,在中文环境需要用

    // 界面语言本地化

扫描二维码关注公众号,回复: 357517 查看本文章

        if (Platform.getNL().contains("zh"))

        {

            domainAxis.setTickLabelFont(new Font("宋体", Font.ITALIC, 12));

            if (label != null)

            {

                domainAxis.setLabelFont(new Font("黑体", Font.BOLD, 14));

            }

            label = rangeAxis.getLabel();

            if (label != null)

            {

                rangeAxis.setLabelFont(new Font("黑体", Font.BOLD, 15));

            }

            TextTitle title = chart.getTitle();

            if (title != null)

            {

                title.setFont(new Font("黑体", Font.BOLD, 18));

            }

        }

4.       如果想知道鼠标双击或是单击时,单击点对应的数据,在mouseEventlistener处理,如果是CategoryPlot。可用

JFreeChart chart = event.getChart();

CategoryPlot plot = (CategoryPlot)chart.getPlot();

Comparable<?> columnKey = plot.getDomainCrosshairColumnKey();

如果是XYPlot,可用

XYItemEntity en1 = (XYItemEntity)entity;

finalint itemNum = en1.getItem();

XYSeriesCollection dataset2 = (XYSeriesCollection)en1.getDataset();

XYSeries series = dataset2.getSeries(0);

XYDataItem dataItem = series.getDataItem(itemNum);

double xValue = dataItem.getXValue();

5.       ChartComposite不能相应MouseDoubleClicked事件,需要继承类,覆盖该方法。可以研究拷贝chartComposite中的mouseDown(event)的处理方式。记得,在该方法最后转为awtMouseEvent时,参考org.jfree.experimental.swt.SWTUtils.toAwtMouseEvent方式将鼠标点击次数变为2

6.       上下文菜单。参考chartComposite的构造,可知chartComposite本身带有上下文菜单,可以选择显示哪些菜单项。也可以添加自定义的菜单项。参考chartComposite中菜单的创建方式,在子类中覆盖createPopupMenu(),添加自己菜单项。同时,需要重载displayPopupMenu(int x, int y)控制自定义菜单项的可用性,如果进一步,不可用的菜单项令其不显示出来,那么需要将createPopupMenu()重载的更彻底,每次display前需要重新创建。

7.       鼠标位置与数据不对应。扩展的ChartComposite(或其本身,没试过),在窗口大小改变时,有时当鼠标点击或是悬浮时,不能显示tooltip,而且点击某个seriesitem数据,并不能得到这个数据。这是窗口大小改变后,鼠标位置和数据对应出现问题。查看mouseDown(event),在根据(xy)找对应的entity时,传入的是通过event[x,y]变换出的[x,y],存在问题,令其传入[event.xevent.y]则能正确找出鼠标对应的entity。以上实验是通过拖拽chartComposite的宽度得出的。不能显示tooltip的原因也是如此。通过重载getToolTipText(MouseEvent e),改变传入EntityCollectionentity的参数[event.x,event.y]能达到显示效果。

8.       JfreechartChartRenderingInfo。在info中表明,chart由一系列的entity组成。一个简单XY的图形,包括2titleEntity2AxisEntity1jfreechartEntity1PlotEntity(图形中除去XYItemEntity全部都是它的区域),若干个XYItemEntity(如果是菱形块表示图上的数据,那么这个entity就是那个图形对应的部分)。找entity,将从数据Entity找起。

9.       对于菱形块图形数据用awtPath2DDouble表示,Double标出4个顶点的位置,判断鼠标【xy】,是否点在菱形块中。

猜你喜欢

转载自sdfx.iteye.com/blog/2310721