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

时间:2015-06-03 06:01:25

标签: java swing jpanel layout-manager

最简单的方法是使JPanel占据其父容器固定百分比的宽度?

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

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

3 个答案:

答案 0 :(得分:5)

你想要的是GridBagLayout。 (How to use?

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

这些限制包括weightx,它完全按照它在锡上所说的那样做。这是在“网格行”中所有组件计算的相对值,类似于分布部分。

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

无论如何:你可以通过指定它在当前行中的组件的百分比或者其中的任意一个来获得weightx所需的值。

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

答案 1 :(得分:3)

您可以使用Relative Layout。这种布局是为此目的而设计的,因为JDK的所有布局都不直接(并且很容易)支持它。

作为一个简单的例子,你可以有3个面板,宽度的25%,25%和50%:

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

答案 2 :(得分:2)

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