【问题标题】:Java - Mixing component size in GroupLayoutJava - 在 GroupLayout 中混合组件大小
【发布时间】:2012-12-07 04:23:21
【问题描述】:

我正在尝试为计算器 GUI 安排两组按钮。每个人都使用 GroupLayout 来制作它们。一组是数字(和“.”),另一组是操作按钮。这基本上是可行的,但如果其中一个按钮的长度是双倍的(例如我的操作集上的等号按钮),它会使其他按钮不合时宜。 我将以操作集为例。有两列四行按钮。最后一行只有一个按钮 - 等于。我想让这个双倍长度延伸到两列。目前,当我希望第二列放在它上面时,它只是将第二列推到它的末尾。

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

operLayout.setAutoCreateGaps(true);
operLayout.setAutoCreateContainerGaps(true);
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))
            .addGroup(operLayout.createParallelGroup().addComponent(equals)));
    operLayout.setHorizontalGroup(operLayout
            .createSequentialGroup()
            .addGroup(
                    operLayout.createParallelGroup().addComponent(leftBracket).addComponent(add)
                            .addComponent(multiply).addComponent(equals))
            .addGroup(
                    operLayout.createParallelGroup().addComponent(rightBracket).addComponent(subtract)
                            .addComponent(divide)));

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

【问题讨论】:

  • 我为您选择GroupLayout 来完成这项任务表示赞赏。我相信这种布局是最强大的标准表单布局。它很容易被忽视,因为它使用起来很复杂。在了解了它的工作原理后,我几乎只使用它。
  • 可以重新格式化您的代码吗?当前;y 它相当难以阅读。
  • 是的,请这样做,尽管有人可能已经打败了你。谢谢@ErickRobertson,我知道你的意思,它看起来很复杂,但一旦你理解它,它真的很有用!

标签: java swing components grouplayout preferredsize


【解决方案1】:

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。突破理解障碍是额外的工作,但这是值得的。
猜你喜欢
  • 2012-03-17
  • 2011-09-16
  • 1970-01-01
  • 2011-02-09
  • 2012-01-19
  • 1970-01-01
  • 2013-08-15
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多