代码之家  ›  专栏  ›  技术社区  ›  Clive Galway

将摆动元件包装在面板顶部

  •  0
  • Clive Galway  · 技术社区  · 10 月前

    给定以下代码:
    (不是我的实际代码,只是我能拼凑出来的最简单的代码,可以重新解决这个问题)

    package com.example;
    
    import javax.swing.Box;
    import javax.swing.BoxLayout;
    import java.awt.BorderLayout;
    import java.awt.Dimension;
    
    import javax.swing.JFrame;
    import javax.swing.JPanel;
    import javax.swing.JScrollPane;
    import javax.swing.JTable;
     
    public class JTableExample {
        JFrame f;
        JTable table;
     
        JTableExample()
        {
            f = new JFrame();
            f.setTitle("JTable Example");
            String[][] data = {
                { "Kundan Kumar Jha", "4031", "CSE" },
                { "Anand Jha", "6014", "IT" }
            };
     
            String[] columnNames = { "Name", "Roll Number", "Department" };
     
            JPanel outerPanel = new JPanel();
            outerPanel.setLayout(new BoxLayout(outerPanel, BoxLayout.Y_AXIS));
    
            for (int i = 0 ; i < 3; i++){
                JPanel tablePanel = new JPanel(new BorderLayout());
                table = new JTable(data, columnNames);
                tablePanel.add(table.getTableHeader(), BorderLayout.PAGE_START);
                tablePanel.add(table, BorderLayout.CENTER);
                outerPanel.add(tablePanel);
                outerPanel.add(Box.createRigidArea(new Dimension(0,20)));
            }
     
            JScrollPane sp = new JScrollPane(outerPanel);
            f.add(sp);
            f.setSize(500, 400);
            f.setVisible(true);
        }
     
        public static void main(String[] args)
        {
            new JTableExample();
        }
    }
    

    你会看到一个看起来像这样的窗口: enter image description here

    我想要的是把桌子都放在窗户的顶部,把所有的空白放在底部,就像这样:
    (我在表格后添加了20个JPanel来复制这张截图) enter image description here

    我曾尝试使用GridBagLayout,但最终的结果是:
    (所有的东西都漂浮在窗户中间)
    enter image description here

    有人能帮我理解我做错了什么吗?
    如果这很重要,在我的实际代码中,有任意数量的表,这不是固定的。

    1 回复  |  直到 10 月前
        1
  •  1
  •   camickr    10 月前

    A. BoxLayout 将为每个组件分配额外空间,直到组件的最大大小。由于面板的最大尺寸远大于面板的首选尺寸,因此您可以获得额外的空间。

    解决这个问题的一种方法是使用“包装器”面板来强制表格面板以其首选高度显示:

    JPanel wrapper = new JPanel( new BorderLayout() );
    wrapper.add(outerPanel, BorderLayout.PAGE_START);
    JScrollPane sp = new JScrollPane(wrapper);
    //JScrollPane sp = new JScrollPane(outerPanel);
    

    另一种选择是覆盖 getMaximumSize() 使用桌面面板的方法将最大高度设置为首选高度。

    类似于:

    JPanel tablePanel = new JPanel(new BorderLayout())
    {
        @Override
        public void getMaximumSize()
        {
            Dimension preferred = getPreferredSize();
            Dimension maximum = getMaximumSize();
            maximum.height = preferred.height;
    
            return maximum;
        }
    };