【问题标题】:Giving a JPanel a percentage-based width给 JPanel 一个基于百分比的宽度
【发布时间】:2015-06-03 06:01:25
【问题描述】:

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

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

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

【问题讨论】:

  • 简单使用GridBagLayout和自定义MigLayout、TableLayout

标签: java swing jpanel layout-manager


【解决方案1】:

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

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

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

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

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

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

【讨论】:

  • 请注意 weightx 仅适用于额外空间。这意味着您添加到布局的两个组件必须已经具有您想要保持的比例的首选大小。然后随着框架的增长/缩小,比例将保持不变。
  • @camickr 我不是已经说过什么了吗? “请注意,当超过组件的最小尺寸时,weightx 才开始发挥作用。”还是我所说的实际上是不正确的,而首选尺寸是相关的度量?
  • 是的,首选尺寸是相关度量。当您打包框架时,首选尺寸用于确定框架的大小。然后随着帧大小的变化, weightx 比率用于以适当的比率更改宽度。
【解决方案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);
  }
}

【讨论】:

    【解决方案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));
    

    【讨论】:

      猜你喜欢
      • 2012-08-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-31
      • 1970-01-01
      • 2017-06-11
      • 2018-09-05
      相关资源
      最近更新 更多