给 JPanel 一个基于百分比的宽度

Giving a JPanel a percentage-based width

制作按宽度占据其父容器固定百分比的 JPanel 的最简单方法是什么?

它的宽度应该在其父容器的宽度发生变化时更新。

我尝试使用 Box.createHorizontalStrut(),但是当 JPanel 的父容器的宽度发生变化时,它不会更新。

你要的是GridBagLayout. (How to use?)

使用 GridbagLayout 允许您为添加的每个组件定义 GridBagConstraints

这些约束包括 weightx,它完全按照锡罐上的说明进行操作。这是在 "grid-row" 中所有组件计算的相对值,类似于分布部分。

请注意,当超过组件的首选大小时,weightx 才开始发挥作用。请注意,这可能会导致有趣的错误,在设置 minimumSize() 时,另请参阅 this SO answer.

无论如何:您可以通过指定它在当前行中的组件的百分比或它的任意倍数来获得您需要的 weightx 值。

这意味着组件占用 可用 父容器宽度的 50%,请使用 weightx = 0.5。确保该行的 weightx 值加起来等于 1.0

另一种选择是使用 SpringLayout:

import java.awt.*;
import javax.swing.*;

public class SpringLayoutTest {
  private JComponent makeUI() {
    SpringLayout layout = new SpringLayout();

    JPanel p = new JPanel(layout);
    p.setBorder(BorderFactory.createLineBorder(Color.GREEN, 10));

    Spring pw = layout.getConstraint(SpringLayout.WIDTH,  p);
    Spring ph = layout.getConstraint(SpringLayout.HEIGHT, p);

    JLabel l = new JLabel("label: 5%, 5%, 90%, 55%", SwingConstants.CENTER);
    l.setOpaque(true);
    l.setBackground(Color.ORANGE);
    l.setBorder(BorderFactory.createLineBorder(Color.RED, 1));

    JButton b = new JButton("button: 50%, 65%, 40%, 30%");

    setPercentage(layout.getConstraints(l), pw, ph, .05f, .05f, .90f, .55f);
    setPercentage(layout.getConstraints(b), pw, ph, .50f, .65f, .40f, .30f);

    p.add(l);
    p.add(b);
    return p;
  }

  private static void setPercentage(
      SpringLayout.Constraints c, Spring pw, Spring ph,
      float sx, float sy, float sw, float sh) {
    c.setX(Spring.scale(pw, sx));
    c.setY(Spring.scale(ph, sy));
    c.setWidth(Spring.scale(pw,  sw));
    c.setHeight(Spring.scale(ph, sh));
  }

  public static void main(String... args) {
    EventQueue.invokeLater(new Runnable() {
      @Override public void run() {
        createAndShowGUI();
      }
    });
  }
  public static void createAndShowGUI() {
    JFrame frame = new JFrame();
    frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    frame.getContentPane().add(new SpringLayoutTest().makeUI());
    frame.setSize(320, 240);
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
  }
}

您可以使用 Relative Layout。此布局是为此目的而设计的,因为来自 JDK 的布局中的 none 直接(并且很容易)支持此功能。

作为一个简单的例子,您可以在宽度的 25%、25% 和 50% 处设置 3 个面板:

RelativeLayout rl = new RelativeLayout(RelativeLayout.X_AXIS);
rl.setFill( true );
JPanel panel = new JPanel( rl );
panel.add(red, new Float(25);
panel.add(green, new Float(25));
panel.add(blue, new Float(50));