You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.26 16:54:03