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

4

如何最简单地创建一个占据其父容器固定百分比宽度的JPanel

当其父容器宽度变化时,该面板的宽度应随之更新。

我尝试使用 Box.createHorizontalStrut(),但该方法并不会在JPanel的父容器宽度变化时自动更新。


2
使用GridBagLayout和自定义MigLayout、TableLayout来实现简单的布局。 - mKorbel
3个回答

7
你需要的是一个GridBagLayout。(如何使用?
使用GridbagLayout允许您为每个单独添加的组件定义GridBagConstraints
这些约束条件包括weightx,它完全按照其字面意思执行。这是在该“网格行”中计算所有组件的相对值,类似于分配部分。
请注意,只有当组件的首选大小超过时,weightx才开始发挥作用。请注意,当设置minimumSize()时,这可能会导致有趣的错误,请参见此SO答案
无论如何:您可以通过指定其在当前行中组件的百分比或其倍数来获取weightx所需的值。
这意味着,如果一个组件要占用父容器可用宽度的50%,则使用weightx = 0.5。确保该行的weightx值总和为1.0

请注意,weightx 只适用于额外的空间。这意味着您添加到布局中的两个组件必须已经具有您想要保持的比例的首选大小。然后随着框架的增长/缩小,比例将得以保持。 - camickr
@camickr,我之前不是已经说过类似的话了吗?“请注意,只有当组件的最小大小被超越时,weightx 才开始发挥作用。”或者我之前说的实际上是错误的,首选大小才是相关的度量标准? - Vogel612
1
是的,首选大小是相关的度量标准。当您打包一个框架时,首选大小用于调整框架的大小。然后,随着框架大小的变化,weightx比率被用来以适当的比例改变宽度。 - camickr

3
另一种选择是使用 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);
  }
}

3
你可以使用 相对布局。这种布局是专门为此而设计的,因为JDK中的任何布局都不直接(和容易)支持此功能。
举个简单的例子,你可以将宽度分成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));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接