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

Swing中在双列布局前添加单列表格未显示的解决方法

Swing表格不显示问题修复

问题根源

表格无法显示主要有两个核心原因:

1. BorderLayout组件覆盖问题

ui 使用 BorderLayout 布局,调用 ui.add(createTablePanel()) 和 ui.add(libSysSearchControl) 时均未指定布局位置,默认会添加到 BorderLayout.CENTER 区域。后添加的 libSysSearchControl 会完全覆盖之前的表格面板,导致表格无法渲染。

2. JTable未放入JScrollPane

直接将 JTable 添加到普通 JPanel 中,表格表头不会被渲染,且表格自身的滚动、布局逻辑无法正常工作。


修复代码

1. 修改initUI()方法,明确BorderLayout位置

给表格面板指定 PAGE_START 位置,确保它显示在双列布局上方:

public void initUI() {
    if (ui != null) {
        return;
    }
    ui = new JPanel(new BorderLayout(4, 4));
    ui.setBorder(new EmptyBorder(4, 4, 4, 4));
    // 指定表格显示在顶部区域
    ui.add(createTablePanel(), BorderLayout.PAGE_START); 

    final JPanel libSysSearchControl = new JPanel(new BorderLayout());
    // 双列布局区域填充剩余空间
    ui.add(libSysSearchControl, BorderLayout.CENTER);

    final JPanel actionPanel = new JPanel(
            new FlowLayout(FlowLayout.CENTER, 15, 15));
    libSysSearchControl.add(actionPanel, BorderLayout.PAGE_END);
    libSysSearchControl.add(getTwoColumnLayout(labels, controls), BorderLayout.CENTER);
}

2. 修改createTablePanel()方法,用JScrollPane包裹JTable

private JPanel createTablePanel() {
    final String[] columnNames = {"Title", "Author", "Publisher",
            "Published Date", "Pages", "Rating"};

    final String[][] rowData = {
            {"Effective Java", "Joshua Bloch", "Addision-Wesley", "May 08th 2008",
                    "346", "5"},
            {"Thinking in Java", "Bruce Eckel", "Prentice Hall", "Feb 26th 2006",
                    "1150", "4"},
            {"Head First Java", "Kathy Sierra & Bert Bates", "O'Reilly Media",
                    "Feb 09th 2005", "688", "4.5"},
    };

    final JTable jTable = new JTable(new DefaultTableModel(rowData, columnNames));
    // 用JScrollPane包裹表格,保证表头和滚动功能正常
    JScrollPane scrollPane = new JScrollPane(jTable);
    
    final JPanel tablePanel = new JPanel(new BorderLayout());
    tablePanel.add(scrollPane, BorderLayout.CENTER);
    return tablePanel;
}

额外说明

  • BorderLayout 的五个区域(PAGE_START、CENTER、PAGE_END、LINE_START、LINE_END)每个区域仅能容纳一个组件,重复添加会覆盖原有组件,必须明确指定位置。
  • Swing中 JTable 配合 JScrollPane 使用是标准规范,否则会丢失表头,且无法处理超出面板范围的内容。

内容的提问来源于stack exchange,提问作者menteith

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.18 16:05:19