今天终于把Window8上显示JFreeChart的问题解决了,需求是在SWT中使用JFreeChart,但JFreeChart要使用AWT的样式,不能使用SWT的样式(ChartComposite),即要使用SWT_AWT桥接来实现SWT中显示JFreeChart。
桥接的方式实现的JFreeChart在Win7上没问题,能直接显示出来,但是在Window 8上第一次加载要很长时间,而且显示不出JFreeChart。使用JFreeChart的swt例子的代码改进改成SWt_AWT测试也是同样问题,main方法中代码如下:
fianel JFreeChart chart = ChartFactory.createTimeSeriesChart(
"Legal & General Unit Trust Prices", // title
"Date", // x-axis label
"Price Per Unit", // y-axis label
dataset, // data
true, // create legend?
true, // generate tooltips?
false // generate URLs?
);
final Display display = new Display();
Shell shell = new Shell(display);
shell.setSize(600, 300);
shell.setLayout(new FillLayout());
shell.setText("Time series demo for jfreechart running with SWT");
Composite comp = new Composite(shell, SWT.EMBEDDED);//SWT.EMBEDDED必须
java.awt.Frame frame = SWT_AWT.new_Frame(comp);
ChartPanel chartPanel = new ChartPanel(chart);
frame.add(chartPanel);
shell.open()
while (!shell.isDisposed()) {
if (!display.readAndDispatch())
display.sleep();
}
这样写Window8第一次打开会很卡,具体原因不知道,之后点击下界面JFreeChart会出现。花了一个星期的时间来看这个问题,想过以下方法:
1、通过给comp加CtrolEvent事件监听,然后模拟AWT的MosueEvent发给ChartPanel,来实现模拟点击,发现不是每次都有效。
2、先打开SWt的窗口,在窗口打开后向frame中添加chartPanel,在frame和chartPanel中间加一个JPanel,该方法在打开的时候能正常显示,窗口最大化时,如果JPanel没有添加布局没问题,添加了布局导致chartPanel会在最大化过程中刷新,就会出现JFreeChart不显示的情况。
最后都没招到好的方法,看了下往上说的加载JFreeChart有时确实会很卡,把ChartPanel的userBuffered标记设为false,就能快点。试了下没想到真的有用。修改代码如下:
ChartPanel chartPanel = new ChartPanel(chart,false);
这个问题看了三天都没解决出来,今天都不想解决了,随便看了下网上相关的文章,试了下就解决了,哎,想起那句话“没多学一点知识,就少写一行代码”。花了那么多时间,最后仅仅是一个false的问题,真是好笑,生活的乐趣在于一个接着一个的惊喜,你永远不知道下一秒会发生什么,如果知道了还有什么意思呢。