首页 > 代码库 > SWT_AWT加载JFreeChart在Window8下显示不出JFreeChart的问题

SWT_AWT加载JFreeChart在Window8下显示不出JFreeChart的问题

  今天终于把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的问题,真是好笑,生活的乐趣在于一个接着一个的惊喜,你永远不知道下一秒会发生什么,如果知道了还有什么意思呢。

 

SWT_AWT加载JFreeChart在Window8下显示不出JFreeChart的问题