BoxLayout拉伸组件以适合父面板

嗨我正在使用BoxLayoutJPanel堆叠在彼此之上( BoxLayout.Y_AXIS ),例如,如果我的父JPanel高度为500像素,我向它添加两个高度为100像素的子面板。 BoxLayout它们拉伸,以便它们共同占据500px空间。 有谁知道如何禁用此function?

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

但是如果你想要使用BoxLayout,并且不希望它们伸展,你可以使用隐形组件填充物检查,例如刚性区域,胶水和填充物。

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

 panel.setMaximumSize( panel.getPreferredSize() ); 

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

尝试这个:

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

码:

 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); 

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

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

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

测试

  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);