欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

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

程序员文章站 2022-03-24 15:24:36
...

工作过程中用到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.       界面语言本地化,在中文环境需要用

    // 界面语言本地化

        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】,是否点在菱形块中。