BoxLayout拉伸组件以适合父面板

时间:2010-02-03 19:58:56

标签: java user-interface swing

您好我使用BoxLayoutJPanel堆叠在一起(BoxLayout.Y_AXIS),例如,如果我的父JPanel高度为500像素,我为它添加了两个高度为100像素的子面板。 BoxLayout将它们拉伸,以便它们共同占据500px空间。有谁知道如何禁用此功能?

5 个答案:

答案 0 :(得分:23)

BoxLayout是少数几个遵循组件最小和最大尺寸的布局管理器之一。因此,如果您想阻止面板拉伸,可以使用:

panel.setMaximumSize( panel.getPreferredSize() );

答案 1 :(得分:10)

请改用GridBagLayout。您可以更好地控制UI。

但是如果你想仍然使用BoxLayout,并且不希望它们伸展,你可以使用invisible component fillers检查,如刚性区域,胶水和填充物。

答案 2 :(得分:4)

正如之前的回答所提到的,诀窍是在盒子布局中使用胶水,填充物和刚性区域。然而,与那个响应者不同,我建议坚持使用BoxLayout - 使用Box比使用Grid Bag更容易完成大多数简单的UI;在典型的对话框中,额外的功率并没有给你带来太大的好处。

在旧的习语中,这些是像Box.createHorizo​​ntalStrut(int x)和Box.createHorizo​​ntalGlue();我的想法是你在第一个和第二个组件之间加一个支柱,然后在第二个组件之后加一个胶水。 (“strut”=现在的“刚性区域”)。

答案 3 :(得分:4)

这似乎完全正常......使用BoxLayout,如你所愿。

test

    this.setLayout(new FlowLayout()); // this being the JFrame

    JPanel panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    panel.setPreferredSize(new Dimension(500, 500));
    panel.setBackground(Color.orange);
    this.add(panel); // add the parent to the JFrame

    JPanel pnlChild1 = new JPanel();
    pnlChild1.setBackground(Color.cyan);
    pnlChild1.setMaximumSize(new Dimension(200, 100));

    JPanel pnlChild2 = new JPanel();
    pnlChild2.setBackground(Color.magenta);
    pnlChild2.setMaximumSize(new Dimension(200, 100));

    panel.add(pnlChild1);
    panel.add(pnlChild2);

答案 4 :(得分:3)

您的面板正在拉伸,因为BoxLayout不会将每个面板限制为其首选大小。您需要找到符合组件首选大小的布局,如BorderLayout的NORTH和SOUTH位置。

试试这个:

  1. 使用BorderLayout创建JPanel。在此JPanel中将您的子组件添加为NORTH。
  2. 为另一个子组件创建第二个JPanel,将其添加为BorderLayout的NORTH
  3. 将两个JPanel添加到BoxLayout。
  4. 代码:

    JPanel panel1 = new JPanel(new BorderLayout());
    panel1.add(component1, BorderLayout.NORTH);
    JPanel panel2 = new JPanel(new BorderLayout());
    panel2.add(component2, BorderLayout.NORTH);
    
    JPanel boxPanel = new JPanel();
    BoxLayout boxLayout = new BoxLayout(boxPanel, BoxLayout.Y_AXIS);
    boxPanel.setLayout(boxLayout);
    boxPanel.add(panel1);
    boxPanel.add(panel2);