Java-在GroupLayout中混合组件大小

Java-在GroupLayout中混合组件大小,java,swing,components,grouplayout,preferredsize,Java,Swing,Components,Grouplayout,Preferredsize,我试图为计算器GUI安排两组按钮。每一个都使用一个GroupLayout来创建它们。一组是数字(和“.”),另一组是操作按钮。这基本上是可行的,但如果其中一个按钮有两倍的长度(例如,我的操作集上的equals按钮),它会将其他按钮抛出。 我将使用操作集作为示例。有两列和四行按钮。最后一行只有一个按钮-等于。我想让这两个柱的长度都增加一倍。现在,当我想让第二根柱子坐在上面时,它只是把第二根柱子推到它的末端 这里是布局的代码-operLayout是操作布局的名称,左括号和右括号在第一行,+和-在第二

我试图为计算器GUI安排两组按钮。每一个都使用一个GroupLayout来创建它们。一组是数字(和“.”),另一组是操作按钮。这基本上是可行的,但如果其中一个按钮有两倍的长度(例如,我的操作集上的equals按钮),它会将其他按钮抛出。 我将使用操作集作为示例。有两列和四行按钮。最后一行只有一个按钮-等于。我想让这两个柱的长度都增加一倍。现在,当我想让第二根柱子坐在上面时,它只是把第二根柱子推到它的末端

这里是布局的代码-operLayout是操作布局的名称,左括号和右括号在第一行,+和-在第二行,*和/在第三行,在最后一行等于。每个按钮在其他地方都设置了最小大小(它们都相同,只是equals的长度是equals的两倍)


我理解为什么会发生这种情况,但我不知道如何解决。有简单的方法吗?还是我应该改变我做这件事的方式?谢谢

equals
组件放在它自己的平行水平组中。

首先,确保在使用
GroupLayout
时使用一致的缩进。我发现这对于跟踪正在发生的事情是绝对重要的

您看到报告行为的原因是等号与第一列按钮属于同一水平平行组。因此,当您将其设置为双宽时,它会将第二列按钮推到右侧。这正是您要它做的,因为您要它留在第一个平行组(列)

为了获得您想要的行为,您必须将该按钮与其他按钮平行地单独布局。你可以把它放在它自己的平行组中。为了获得最佳行为,您可能还希望对该组进行调整。我认为
GroupLayout.Alignment.CENTER
是您想要的

还要注意,如果一个组中只有一个组件,则不需要创建新组。只需添加该组件即可

operLayout.setVerticalGroup(operLayout.createSequentialGroup()
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
        .addComponent(leftBracket)
        .addComponent(rightBracket))
    .addGroup(operLayout.createParallelGroup()
        .addComponent(add)
        .addComponent(subtract))
    .addGroup(operLayout.createParallelGroup()
        .addComponent(multiply)
        .addComponent(divide))
    .addComponent(equals));
operLayout.setHorizontalGroup(operLayout.createParallelGroup()
    .addGroup(operLayout.createSequentialGroup()
        .addGroup(operLayout.createParallelGroup()
            .addComponent(leftBracket)
            .addComponent(add)
            .addComponent(multiply))
        .addGroup(operLayout.createParallelGroup()
           .addComponent(rightBracket)
           .addComponent(subtract)
           .addComponent(divide)))
    .addComponent(equals));

我为您选择
GroupLayout
完成此任务而鼓掌。我相信这种布局是最强大的布局标准形式。它很容易被忽略,因为它使用起来很复杂。在了解了它的工作原理后,我几乎只使用它。你能重新格式化你的代码吗?现在的是的,请读,尽管可能有人比你先读。谢谢@ErickRobertson,我知道你的意思,它看起来很复杂,但一旦你理解了,它就真的很有用了!谢谢你的帮助!是的,我意识到这就是我告诉它的,我得到的结果并不让我感到惊讶,我只是不知道如何重新安排以使它正确。我不太明白你在说什么,但当你说把它放在它自己的平行组(水平或垂直?我会假设垂直或两者都有?),但你说如果它是一个组件,它不需要一个组。我已经尝试了你给出的代码,以及你对组/组件所说的变体,使用中心对齐,但我所做的没有改变。好吧,对不起,我刚刚意识到你说的是水平开始,但这样做并不能解决问题。我不知道为什么这不能解决你的问题。确保缩进与括号对齐,以便将组件添加到正确的组中。它应该与包含水平组中两列的顺序组并行添加。这是可行的,所以我不确定你有什么不同的做法。但如果根据原始代码的组织方式,它位于错误的位置,我不会感到惊讶。我整理了很多代码,我(几乎)肯定我做得对,但你可能是对的。从那时起,我想到了另一个按钮添加,不再需要双倍长度的一个。如果我以后需要它,我会参考这篇文章-谢谢你的帮助!没问题。我推荐您使用
GroupLayout
。突破理解障碍是额外的工作,但这是值得的。
operLayout.setVerticalGroup(operLayout.createSequentialGroup()
    .addGroup(operLayout.createParallelGroup(GroupLayout.Alignment.BASELINE)
        .addComponent(leftBracket)
        .addComponent(rightBracket))
    .addGroup(operLayout.createParallelGroup()
        .addComponent(add)
        .addComponent(subtract))
    .addGroup(operLayout.createParallelGroup()
        .addComponent(multiply)
        .addComponent(divide))
    .addComponent(equals));
operLayout.setHorizontalGroup(operLayout.createParallelGroup()
    .addGroup(operLayout.createSequentialGroup()
        .addGroup(operLayout.createParallelGroup()
            .addComponent(leftBracket)
            .addComponent(add)
            .addComponent(multiply))
        .addGroup(operLayout.createParallelGroup()
           .addComponent(rightBracket)
           .addComponent(subtract)
           .addComponent(divide)))
    .addComponent(equals));