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
相关产品推荐
相关产品推荐

