【问题标题】:GridBagLayout: SwingGridBagLayout:摆动
【发布时间】:2018-02-16 14:02:29
【问题描述】:

我对 Swing 中的 GridBaGLayout 有一个非常基本的疑问。我试图首先将给定的帧分成三个部分,权重为(0.2、0.2 和 0.6)。下面的代码工作正常,因为我看到三个部分具有各自的权重。

        JFrame frame = new JFrame();
        frame.setLayout(new GridBagLayout());
        JPanel p1= new JPanel(), p2 = new JPanel(), p3 = new JPanel();


    GridBagConstraints c = new GridBagConstraints();
    c.fill = GridBagConstraints.BOTH;

    c.weightx = 1;
    c.weighty = 0.2;
    c.gridx = 0;
    c.gridy = 0;
    frame.add(p1,c);
    p1.setBackground(Color.lightGray);

    c.gridy = 1;
    frame.add(p2,c);
    p2.setBackground(Color.gray);

    c.weighty = 0.6;
    c.gridy = 2;
    frame.add(p3,c);
    p3.setBackground(Color.blue);

接下来我尝试在面板 p1 中添加一个 JLabel。像这样:p1.add(new JLabel("Hi"))。如果我在添加之前和之后观察打开的框架,我会看到两种情况下分配的权重不同。首先(当不添加 JLabel 时),分配 0.2、0.2 和 0.6。其次,添加JLabel时,第一个面板增加一点,第二个面板减少一点。您还可以在下面的图片中看到:

这是什么原因?我认为这与根据父框架或面板中的可用空间分配权重的布局有关。但不是很理解正确的推理。
weightx/y 划分基于可用空间。那么面板 p1 和 p2 如何获得几乎相同的高度?设框架的高度为 h。添加 p1 后,可用高度为 h,然后 p1 得到 0.2*h,剩下的可用高度为 0.8h。现在当必须添加 p2 时,将给它 0.8h 的 0.2,即 0.16h。那么 p1 和 p2(浅灰色和深灰色背景色)如何看起来具有相同的高度?

另外,我怎样才能实现恒定的划分并保持分配的面板的权重相同?

【问题讨论】:

    标签: java swing layout layout-manager gridbaglayout


    【解决方案1】:

    我试图首先将给定的帧分为三个部分,权重为(0.2、0.2 和 0.6)。

    “weightx/y”约束用于“额外”空间。

    每个组件都按其首选大小分配空间。然后,如果帧大小增加,每个组件都会以指定的比例获得额外的空间。因此,除非每个组件的首选尺寸也符合指定的比例,否则组件将不会具有整体所需的比例。

    空 JPanel 的高度为 10(基于 FlowLayout 的默认大小计算)。因此,所有 3 个面板的首选高度都是 30。

    如果您有一个大小为 130 的内容窗格,那么您有 100 像素的额外空间,因此面板的大小变为:

    p1 = 10 + (100 * .2) = 30
    p2 = 10 + (100 * .2) = 30
    p3 = 10 + (100 * .6) = 70
    

    当您将标签添加到 p1 时,首选高度变为 10 加上标签的高度,假设 (10 + 15) = 25。所以现在 3 个面板的首选高度是 (25 + 10 + 10) = 45。所以只有 85 个像素可以按照您指定的比例进行分割。

    如何实现恒定分割并保持分配的面板权重相同?

    您可以查看Relative Layout。它旨在允许您指定每个组件的相对大小。

    【讨论】:

    • weightx/y 划分基于可用空间。那么面板 p1 和 p2 如何获得几乎相同的高度?设框架的高度为 h。添加 p1 后,可用高度为 h,然后 p1 得到 0.2*h,剩下的可用高度为 0.8h。现在当必须添加 p2 时,将给它 0.8h 的 0.2,即 0.16h。那么 p1 和 p2(浅灰色和深灰色背景色)如何看起来具有相同的高度?
    • @user3552407, When p1 is added, available height is h, then p1 gets 0.2*h, which leaves us with available as 0.8h - 分配在所有同时具有权重的面板上完成。请参阅更新的说明。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    相关资源
    最近更新 更多