JInternalFrame嵌套子JInternalFrame无法显示问题求助
问题排查与解决
可能的原因及对应修复方法
1. 父容器布局区域高度不足
你把desktop放在了BorderLayout.SOUTH区域,而BorderLayout的南北区域高度由组件的首选高度决定。如果desktop没有设置合适的首选大小,或者父JInternalFrame的整体布局导致SOUTH区域被压缩到高度为0,就会看不到里面的子窗口。
修复方法:
- 给
desktop设置明确的首选大小:desktop.setPreferredSize(new Dimension(0, 300)); // 按需调整高度值 - 或者调整布局策略,比如将
desktop放在BorderLayout.CENTER区域(如果不需要同时显示tableScrollpane),或通过布局管理器配置组件的空间分配优先级。
2. 子窗口显示方法冗余且可能冲突
Chart构造函数里同时调用了过时的this.show()和this.setVisible(true),虽然底层逻辑重叠,但冗余调用可能引发状态冲突,建议只保留标准的setVisible(true)。
修改后的Chart构造函数片段:
public Chart(String title, String quoteMarket,BarSeries barSeries){ System.out.println("Chart created"); setTitle(title + " " + quoteMarket); setSize(500,500); setMaximizable(true); setIconifiable(true); setClosable(true); setResizable(true); setLayout(new GridLayout(0,1)); this.displayChart(title,quoteMarket,barSeries); this.pack(); this.setVisible(true); // 仅保留这一行显示控制代码 }
3. 添加子窗口后未触发容器刷新
添加子JInternalFrame后,需要主动通知desktop重新计算布局并刷新界面,避免组件状态未同步。
修改addChart方法:
private void addChart(Market market){ Chart chart = new Chart(market.getSymbol(),this.quoteMarket, Indicators.convertToTa4JBarSeries(market.getSymbol(),market.getCandles())); this.desktop.add(chart); this.desktop.validate(); // 触发布局更新 this.desktop.repaint(); // 强制刷新界面 // 可选:让子窗口在desktop中居中显示 chart.setLocation((desktop.getWidth() - chart.getWidth())/2, (desktop.getHeight() - chart.getHeight())/2); }
4. 验证父容器初始化正确性
确保desktop是正确实例化的JDesktopPane对象,比如:
JDesktopPane desktop = new JDesktopPane();
避免初始化时错误设置布局或隐藏属性。
内容的提问来源于stack exchange,提问作者BitQueen
相关产品推荐
相关产品推荐

