Java 为JPanel提供基于百分比的宽度

Java 为JPanel提供基于百分比的宽度,java,swing,jpanel,layout-manager,Java,Swing,Jpanel,Layout Manager,制作一个按宽度占父容器固定百分比的JPanel最简单的方法是什么 当其父容器的宽度更改时,其宽度应更新 我尝试使用了Box.createHorizontalStruct(),但是当JPanel的父容器的宽度发生变化时,它不会更新。您想要的是一个。() 使用GridbagLayout可以为添加的每个组件定义 这些约束条件包括,哪一个完全按照tin上的说明执行。这是在该“网格行”中的所有组件上计算的相对值,类似于分布零件 请注意,只有当超过组件的首选大小时,weightx才开始发挥作用。请注意,在设

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

当其父容器的宽度更改时,其宽度应更新

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

您想要的是一个。()

使用GridbagLayout可以为添加的每个组件定义

这些约束条件包括,哪一个完全按照tin上的说明执行。这是在该“网格行”中的所有组件上计算的相对值,类似于分布零件

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

无论如何:您可以通过指定weightx在其当前行的组件中的百分比或其任意倍数来获得所需的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);
  }
}
你可以用这个。这个布局就是为了这个目的而设计的,因为没有一个来自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));

通过使用GridBagLayout和自定义MigLayout,TableLayout非常简单。请注意,weightx只适用于额外的空间。这意味着您添加到布局中的两个组件必须已经具有您想要保持的比率中的首选大小。然后随着帧的增大/缩小,比率将保持不变。@camickr我不是已经说过了吗?“请注意,只有当超过组件的最小尺寸时,weightx才开始发挥作用。”或者我在那里说的话实际上是不正确的,首选尺寸是相关的度量值?是的,首选尺寸是相关的度量值。打包框架时,使用首选尺寸调整框架尺寸。然后,随着帧大小的改变,weightx比率用于以适当的比率改变宽度。