工作过程中用到jfreechart输出两个图形,一个是柱状图,一个是曲线图。整理一下用到的几个点。
1. 创建chartpanel,之前在swt中使用jfreechart需要使用SWT_AWT进行swt和awt的桥接①。现在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是否产生tooltips。2在构造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. 如果想知道鼠标双击或是单击时,单击点对应的数据,在mouseEvent的listener处理,如果是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,而且点击某个series的item数据,并不能得到这个数据。这是窗口大小改变后,鼠标位置和数据对应出现问题。查看mouseDown(event),在根据(x,y)找对应的entity时,传入的是通过event[x,y]变换出的[x,y],存在问题,令其传入[event.x,event.y]则能正确找出鼠标对应的entity。以上实验是通过拖拽chartComposite的宽度得出的。不能显示tooltip的原因也是如此。通过重载getToolTipText(MouseEvent e),改变传入EntityCollection找entity的参数[event.x,event.y]能达到显示效果。
8. Jfreechart的ChartRenderingInfo。在info中表明,chart由一系列的entity组成。一个简单XY的图形,包括2个titleEntity,2个AxisEntity,1个jfreechartEntity,1个PlotEntity(图形中除去XYItemEntity全部都是它的区域),若干个XYItemEntity(如果是菱形块表示图上的数据,那么这个entity就是那个图形对应的部分)。找entity,将从数据Entity找起。
9. 对于菱形块图形数据用awt的Path2D的Double表示,Double标出4个顶点的位置,判断鼠标【x,y】,是否点在菱形块中。