Java应用集成XChart展示图表触发invokeAndWait调用错误如何解决
错误根因
Exception in thread "AWT-EventQueue-0" java.lang.Error: Cannot call invokeAndWait from the event dispatcher thread
这个报错的本质是SwingUtilities.invokeAndWait()方法只能从非事件调度线程(非EDT)调用,作用是同步提交任务到EDT执行并等待完成;而你点击按钮触发的代码本身就运行在EDT中,XChart的SwingWrapper.displayChart()方法内部默认调用了invokeAndWait初始化窗口,就触发了Swing的线程规则冲突。
修复方案
你可以选择以下任意一种方式修改代码:
- 方案1:改用异步方式显示窗口,把原来调用
displayChart()的代码替换为:
SwingUtilities.invokeLater(() -> { JFrame chartFrame = new SwingWrapper<>(chart).getJFrame(); chartFrame.setVisible(true); });
- 方案2:因为你的
BarCharts本身就是JFrame子类,不需要额外用SwingWrapper创建新窗口,直接把图表面板嵌入当前窗口即可:
// 删掉原来的new SwingWrapper<CategoryChart>(chart).displayChart(); 行,替换为以下代码 add(new XChartPanel<>(chart)); pack(); setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); setVisible(true);
补充优化点
你的代码中连续两次创建了CategoryChart实例,第一次创建的对象会被第二次CategoryChartBuilder生成的对象直接覆盖,属于无效代码,可以直接删除第一行chart = new CategoryChart(300,400, Styler.ChartTheme.XChart);减少不必要的资源消耗。
内容的提问来源于stack exchange,提问作者mikegr3pe
相关产品推荐
相关产品推荐

