求助:向JFrame添加两个JTable仅显示一个的问题
问题原因
JFrame默认使用BorderLayout布局,当你直接调用f.add(listPahel)和f.add(listPahel2)时,没有指定布局位置,两个组件都会被默认添加到BorderLayout.CENTER区域——这个区域只能容纳一个组件,后添加的listPahel2会覆盖掉之前的listPahel,所以最终只显示第二个表格。
解决方法
你需要用合适的布局管理器来容纳两个面板,让它们同时显示。下面提供两种简单的实现方式:
方式一:用BoxLayout垂直排列两个表格
创建一个主面板,设置垂直方向的BoxLayout,把两个表格所在的面板都加到这个主面板里,再把主面板添加到JFrame中:
private JFrame f = new JFrame("List of cars"); f.setSize(700, 600); // 第一个表格 DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("GROUP 1"); table.setPreferredScrollableViewportSize(new Dimension(300, 200)); // 调整合适的显示大小 JScrollPane jScrollPane1 = new JScrollPane(table); JPanel listPahel = new JPanel(new BorderLayout()); listPahel.add(jScrollPane1, BorderLayout.CENTER); listPahel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 缩小边框间距,避免挤压表格 // 第二个表格 DefaultTableModel model2 = new DefaultTableModel(); JTable table2 = new JTable(model2); model2.addColumn("GROUP 2"); table2.setPreferredScrollableViewportSize(new Dimension(300, 200)); JScrollPane jScrollPane2 = new JScrollPane(table2); JPanel listPahel2 = new JPanel(new BorderLayout()); listPahel2.add(jScrollPane2, BorderLayout.CENTER); listPahel2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 主面板,垂直排列两个表格面板 JPanel mainPanel = new JPanel(); mainPanel.setLayout(new BoxLayout(mainPanel, BoxLayout.Y_AXIS)); mainPanel.add(listPahel); mainPanel.add(listPahel2); f.add(mainPanel); // 把主面板加到JFrame f.setVisible(true);
方式二:用GridLayout分两行显示
直接给JFrame设置GridLayout,分成两行一列,分别添加两个面板:
private JFrame f = new JFrame("List of cars"); f.setSize(700, 600); f.setLayout(new GridLayout(2, 1)); // 设置两行一列的网格布局 // 第一个表格(代码和上面一致,调整边框和大小) DefaultTableModel model = new DefaultTableModel(); JTable table = new JTable(model); model.addColumn("GROUP 1"); table.setPreferredScrollableViewportSize(new Dimension(300, 200)); JScrollPane jScrollPane1 = new JScrollPane(table); JPanel listPahel = new JPanel(new BorderLayout()); listPahel.add(jScrollPane1, BorderLayout.CENTER); listPahel.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 第二个表格 DefaultTableModel model2 = new DefaultTableModel(); JTable table2 = new JTable(model2); model2.addColumn("GROUP 2"); table2.setPreferredScrollableViewportSize(new Dimension(300, 200)); JScrollPane jScrollPane2 = new JScrollPane(table2); JPanel listPahel2 = new JPanel(new BorderLayout()); listPahel2.add(jScrollPane2, BorderLayout.CENTER); listPahel2.setBorder(BorderFactory.createEmptyBorder(10, 10, 10, 10)); // 直接添加到JFrame,GridLayout会自动分配位置 f.add(listPahel); f.add(listPahel2); f.setVisible(true);
另外注意:你之前设置的EmptyBorder参数过大(比如500的右边框),会把表格挤压到几乎看不见,建议调整成合理的间距值,比如10。
内容的提问来源于stack exchange,提问作者Max_insane
相关产品推荐
相关产品推荐

