【问题标题】:BoxLayout stretches component to fit parent panelBoxLayout 拉伸组件以适应父面板
【发布时间】:2011-01-12 19:01:38
【问题描述】:

嗨,我正在使用 BoxLayoutJPanels 堆叠在一起 (BoxLayout.Y_AXIS),例如,如果我的父级 JPanel 的高度为 500 像素,并且我向其添加了两个子面板高度为 100 像素。 BoxLayout 拉伸它们,使它们一起占据 500px 的空间。有谁知道如何禁用此功能?

【问题讨论】:

  • 您如何设置子面板的尺寸?
  • 与 panel.setPreferedSize 和 panel.setMinimumSize 都使用相同的维度

标签: java user-interface swing


【解决方案1】:

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

panel.setMaximumSize( panel.getPreferredSize() );

【讨论】:

  • 这可能是很久以前的事了,但这是使用覆盖的 getPreferredSize() 方法吗?
  • @MikeM,不,因为面板依赖布局管理器返回首选大小。实际上更好的解决方案是扩展 JPanel 并覆盖 getMaximumSize() 方法以简单地从 getPreferredSize() 方法返回值。这样,在首选尺寸动态变化的情况下,将动态计算最大尺寸。
【解决方案2】:

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

但如果您仍想使用 BoxLayout,并且不希望它们拉伸,您可以使用 invisible component fillers 进行检查,例如刚性区域、胶水和填充物。

【讨论】:

  • 如果对我投反对票,请提供理由
  • 请务必查看发布链接中的“水平胶水”部分。很有帮助。
【解决方案3】:

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

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

【讨论】:

  • 我同意对于一般的堆叠目的,GridBagLayout 可能是矫枉过正。如果他继续前进,只是建议。
  • 我尝试在两个子面板之间放置一个刚性区域并在第二个子面板之后放置垂直胶水,放置面板仍在拉伸:s
  • 没有所谓的矫枉过正 :)
  • 尝试为底部的 2 个面板添加一个面板容器,然后将这两个面板本身粘贴在一个盒子中...我不清楚您要寻找的排列方式,但您总能找到使用子面板、支柱和胶水的某种组合,使物体不会拉伸。
【解决方案4】:

这似乎工作得非常好...使用 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);

【讨论】:

    【解决方案5】:

    您的面板正在拉伸,因为 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);
    

    【讨论】:

    • 我喜欢这个解决方案,因为它可以避免弄乱 gridbag 和修改组件本身,这两者都是一个很好的优势。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-03-16
    • 2015-07-20
    • 2013-08-22
    • 1970-01-01
    • 1970-01-01
    • 2020-11-02
    相关资源
    最近更新 更多