Java 网格布局权重对齐

Java 网格布局权重对齐,java,swing,awt,gridbaglayout,Java,Swing,Awt,Gridbaglayout,我正在生成一个需要使用相对大小的布局,在不使用外部Java布局库的情况下,我发现的唯一方法是GridBagLayout的weightx和weighty 在这一点上,它一直在完全按照我的需要工作,只有一个小的例外。当我有一列包含两个JPanel,空间分布分别为66.6%和33.3%,然后另一列包含3个JPanel,每个JPanel使用33.3%的空间时,第一列的33.3%与第二列的33.3%不同。我需要它们完全对齐 不幸的是,这是我的第一篇帖子,我无法发布任何图片,我希望我不会因为做以下事情而遇到

我正在生成一个需要使用相对大小的布局,在不使用外部Java布局库的情况下,我发现的唯一方法是GridBagLayout的weightx和weighty

在这一点上,它一直在完全按照我的需要工作,只有一个小的例外。当我有一列包含两个JPanel,空间分布分别为66.6%和33.3%,然后另一列包含3个JPanel,每个JPanel使用33.3%的空间时,第一列的33.3%与第二列的33.3%不同。我需要它们完全对齐

不幸的是,这是我的第一篇帖子,我无法发布任何图片,我希望我不会因为做以下事情而遇到麻烦:

我想我知道问题是什么,在每个JPanel中我有一个JLabel,因为weightx和weighty的定义是“权重用于确定如何在列(weightx)和行(weighty)之间分配空间。”我猜这两个33.3%s之间的区别在于,第二列包含一个额外的JLabel

在本文中,StanislavL说“容器向孩子们询问他们的首选大小”,因此,我想知道解决方案是否是覆盖JLabel的getPreferredSize方法。 我不知道这样做会有多“肮脏”,我将非常感谢你的建议来解决这个问题

提前谢谢

迭戈

公认的回答是:

如果面板内的空间大于首选尺寸 其中包含的组件、权重X和权重Y用于 将额外的空间分配给各个组件

weight
不会将每个盒子“锁定”到正好33%的高度;它并没有分配所有的空间,而是只分配额外的空间

因此,如果您需要它们完美地排列,请使用(而不是像您建议的那样重写
getPreferredSize

我想知道解决方案是否是覆盖JLabel的getPreferredSize方法

尝试一下,除非我会重写panels getPreferredSize()方法,因为它会改变面板大小,而面板大小将随着帧的增大/缩小而调整

我不知道这样做会有多“肮脏”

重写优先于使用setPreferredSize()方法

我发现的唯一方法是不使用外部Java布局库


如果外部库使代码更易于使用和理解,为什么不使用它呢?是专门为此目的设计的,因此您不必随意调整大小。

对两列使用单个
GridBagLayout
,而不是分开
GridBagLayout
允许您做的不仅仅是一个HTML表格,而不必修改您的大小和首选的大小方法。可以在框架初始值设定项中执行以下操作:

getContentPane().setLayout(new GridBagLayout());
GridBagConstraints constraints = null;
Insets insets = new Insets(0, 0, 0, 0);
...
// upper left hand corner, 1 column wide, 2 rows high, make the column take up half of the total width, the row(s) take up 0.66 of the total height
constraints = new GridBagConstraints(0, 0, 1, 2, 0.5, 0.66, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0);
getContentPane().add(upperLeftPanel, constraints);

// lower left hand corner, 1 column wide, 1 row high, make the column take up half of the total width, the row take up 0.33 of the total height
constraints = new GridBagConstraints(0, 1, 1, 1, 0.5, 0.33, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0);
getContentPane().add(lowerLeftPanel, constraints);

// upper right hand corner, 1 column wide, 1 row high, make the column take up half of the total width, the row take up 0.33 of the total height
constraints = new GridBagConstraints(1, 0, 1, 1, 0.5, 0.33, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0);
getContentPane().add(upperRightPanel, constraints);

// center right hand side, 1 column wide, 1 row high, make the column take up half of the total width, the row take up 0.33 of the total height
constraints = new GridBagConstraints(1, 1, 1, 1, 0.5, 0.33, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0);
getContentPane().add(centerRightPanel, constraints);

// lower right hand corner, 1 column wide, 1 row high, make the column take up half of the total width, the row take up 0.33 of the total height
constraints = new GridBagConstraints(1, 2, 1, 1, 0.5, 0.33, GridBagConstraints.CENTER, GridBagConstraints.BOTH, insets, 0, 0);
getContentPane().add(bottomRightPanel, constraints);

约束的各种属性以及您将在其中添加面板的容器完全由您决定。每次都可以更改相同的约束对象或创建新的约束对象。我看到两者都用过,但我自己倾向于后者。如您所见,将多个列添加到单个
GridBagLayout

中没有问题。您愿意将两个面板的内容放在单个面板中吗?这样你就可以用一个单一的布局把所有东西完美地排列起来。谢谢你的建议,如果我理解正确的话,不幸的是,我不认为这是我问题的解决方案,因为在这种情况下,我会有一个完全对齐的网格,但我无法指定例如左列为60%+40%,右列为66.6%+33.3%。当然可以。GridBagLayout就是这样工作的。很快我会附上一个答案和一个例子。对不起,我明白你的意思,你是对的,将两个粉红色的GridBagLayouts合并成一个(60+40/66.6+33.3)是完全可能的。我看到两件事,1)对齐可能会保持不均匀,2)由于我是基于XML文件以动态方式生成此布局,因此由于XML数据的结构,有两个布局对我来说更有意义。(这是一个非常基本的示例,但布局可能会变得更复杂)。如果您还想提供一个更简单的解决方案,我很高兴看到它,非常感谢您的支持和兴趣。我重写了面板的getPreferredSize()方法,返回高度为0的维度,它可以工作!所以,如果你认为这是一种安全的方法,不仅可以相对地分配额外的空间,还可以相对地分配不同单元的所有空间,那么我对这个解决方案非常满意。顺便说一句,我向老板推荐了MiG布局,但他不想集成库,毕竟GridBagLayout正在处理它。谢谢我是这里的新手,我很困惑,当两个人给出了有效的解决方案,但他们彼此矛盾时,我该怎么办?使用setPreferredSize()与重写getPreferredSize()相比。谢谢你的帮助,我期待着积极参与社区活动,我真的不知道为什么我以前没有注册。
当两个人给出了有效的解决方案,但每个解决方案都相互矛盾时,我该怎么办?
鉴于两个答案都没有给出使用一种方法而不是另一种方法的理由,因此很难做出明智的决定:)我倾向于关注声誉点。大多数论坛的长期用户都会提出建议,这是论坛用户的共识答案。在这种情况下,解决方案会变得更加明显。您只需要硬编码高度,而不需要硬编码宽度。这只能通过覆盖来实现,因为您不想硬编码宽度。
因此,如果您认为这是一种安全的方法,不仅可以相对分配额外的空间,还可以相对分配不同单元格的所有空间,那么我对解决方案非常满意。
-如果您需要将面板添加到JScrollPane,我总是有点担心,因为滚动只适用于w