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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.01 08:20:43