【问题标题】:gridheight doesn't seem to work网格高度似乎不起作用
【发布时间】:2014-11-09 22:10:40
【问题描述】:

我正在尝试使用 GridBagLayout,但遇到了一些问题。我想使用 12 行进行布局。所以首先我让两个 JPanel 填满前两行(gridheight = 1)。然后我制作了 5 个其他 JPanel 来填充其他 10 行(gridheight = 2)。底部的 5 个 JPanel 得到 gridheight = {2,4,6,8,10},所以它们不会重叠或任何东西。 我现在遇到的问题是:
所有 JPanel 的大小都相同!

我也以两种方式填写,不使用任何锚点。如果我添加一个带有 gridx = 1、gridy = 0 和 gridheight = 2 的 JPanel,那么它将具有两倍的高度,那么这里有什么问题呢?我是否必须事先告诉布局系统我要使用的总行数?如果是这样,我该怎么做?

【问题讨论】:

  • 如果您没有尽快获得帮助,请考虑创建并发布Minimal, Complete, and Verifiable Example Program,您可以在其中将代码压缩成仍可编译和运行的最小位,没有外部依赖项(例如需要链接到数据库或图像),没有与您的问题无关的额外代码,但仍能演示您的问题。

标签: java swing layout-manager gridbaglayout


【解决方案1】:

GridBagLayout (GBL) 有几个方面被初次使用的用户所遗漏。

1) 放置在 GBL 内的组件将以其“首选”大小进行初始化。 JPanel iirc 的首选大小为 1x1。

2) 如果您希望 GBL 单元格根据封闭容器调整大小,您需要给它们一个 weightx 和 weighty。这两个属性的作用是说,根据分配的所有 weightx 和 weighty 的比率,给单元格一个可用区域的百分比。例如如果我有 2 个单元格,其中 1 个单元格的 weightx = 1.0,第二个单元格的值为 2.0,则第一个单元格的宽度将是第二个单元格的 1/2(或者第二个单元格的宽度是第二个单元格的两倍)。

3) GBL 在您第一次尝试时需要进行大量试验和错误,但它是最强大、最灵活、最可靠的布局(尤其是与嵌套布局相比,blech)

【讨论】:

  • +1,但最后一点(第 3 点)值得商榷。有些人对 MigLayout 等 3rd 方布局发誓。
  • 嗯,在两个方面...复合布局使生成高度复杂的布局变得更加容易,这些布局易于管理,更易于更新和维护(恕我直言) - 当您拥有的唯一工具是锤子时,那么每个问题看起来都像钉子。将自己限制在单一布局中是有限的。我想说 MigLayout 更灵活,功能更丰富,但增加了外部依赖......这一切都归结为需求
  • 没有人说这是唯一的解决方案。不过,我对第三方解决方案的感觉是,如果 jdk 已经提供了您需要的东西,为什么还要利用其他东西。我试图只利用来填补 jdk 不提供的漏洞。
  • 我以各种方式使用了重量,但我没有得到任何不同的结果。那我应该怎么做呢?
  • 您在绑定每个元素时是否为 GridBagContraints 指定了填充? fill = NONE 将导致它们全部折叠到首选/最小尺寸。
【解决方案2】:

所以对于前两行我说:

 c.fill = GridBagConstraints.HORIZONTAL;
 c.gridwidth = 1;
 c.gridheight = 1;
 c.ipadx = 100;
 c.ipady = h / (2 * columns + 2);
 c.weightx = 1.0;
 c.weighty = 1.0;

对于接下来的行,我只更改 c.ipady:

 c.ipady = h / (columns + 1);

所以这基本上解决了我的问题,但我仍然认为它本来可以容易得多。

附:变量 h 是我屏幕的高度。

【讨论】:

  • 这确实不是正确的想法,因为现在您只是想像使用绝对布局一样使用 GridBagLayout。
猜你喜欢
  • 2018-10-08
  • 2013-06-30
  • 2020-03-25
  • 2022-12-02
  • 2020-12-14
  • 1970-01-01
  • 2018-05-19
  • 1970-01-01
  • 2011-08-18
相关资源
最近更新 更多