1

Java 摇摆:

我创建了一个返回 GridBagConstraints 的方法,这样我就不需要不断调用 new GridBagConstraints(); 并设置一堆变量。它是这样工作的:

displayPanel.add(labelPanel, createGBC(0, 0, 2);
displayPanel.add(nosePanel, createGBC(1, 0, 3);
displayPanel.add(mainPanel, createGBC(2, 0, 3);

ETC..

我的 createGBC 的代码:

private GridBagConstraints createGBC(int x, int y, int z) {
    gbc = new GridBagConstraints();
    gbc.gridx = x;
    gbc.gridy = y;
    gbc.gridwidth = 1;
    gbc.gridheight = 1;
    gbc.anchor = (x == 0) ? GridBagConstraints.EAST : GridBagConstraints.WEST;
    if (z == 0) gbc.insets = new Insets(0, 0, 0, 0);
    else if (z == 1) gbc.insets = new Insets(8, 0, 0, 0);
    else if (z == 2) gbc.insets = new Insets(4, 4, 0, 4);
    else if (z == 3) gbc.insets = new Insets(0, 2, 0, 2);
    else if (z == 4) gbc.insets = new Insets(0, 0, 16, 0);
    else if (z == 5) gbc.insets = new Insets(6, 0, 16, 0);
    return gbc;
}

我的问题是:有没有比简单地做大量 else if 语句更好的方法来处理许多不同的插图?我目前的方法出现了几个问题。

  1. 我开始忘记将哪些插图分配给 z 的哪个值。(我正在尝试重构以使其更具可读性/可重用性)。

  2. 实际上,我可能不得不添加更多的嵌入预设,这将复合问题 1。

4

2 回答 2

2

当您将组件添加到 aGridBagLayout时,GridBagLayout将复制约束,这意味着您无需在每次想要进行小的更改时都创建新实例,例如...

setLayout(new GridBagLayout());
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = 0;
gbc.gridy = 1;
gbc.insets = new Insets(0, 0, 0, 0);
add(labelPanel, gbc);

gbc.gridx = 1;
gbc.insets = new Insets(0, 2, 0, 2);
add(nosePane, gbc);
gbc.gridx = 2;
add(mainPanel, gbc);

这意味着您只需更改您需要的那些属性,并且可以继续重用您之前设置的基本约束。

当您需要更改/重置的属性数量变得很大(或者您不记得或需要更改的属性)时,您可以创建一个新的约束实例。

我倾向于以这种方式将单个实例用于组件的“组”。

如果在您的情况下,您想重用Insets,那么也许您可以创建一系列常量并使用它们,这将使您的代码更易于阅读和维护

于 2015-10-26T20:29:53.577 回答
1

正如 MadProgrammer 所提到的,您不需要每次都使用新的 GridBagConstraints 对象,因为 GridBagLayout 会为每个添加的组件克隆约束。

通常,我建议您将 int 值 ( z) 替换为枚举常量,并将您的 Insets 对象作为值存储在EnumMap中。但在你的情况下,有一个更简单的解决方案:

GridBagConstraints gbc = new GridBagConstraints();

gbc.anchor = GridBagConstraints.EAST;
gbc.insets = new Insets(4, 4, 0, 4);
displayPanel.add(labelPanel, gbc);

gbc.anchor = GridBagConstraints.WEST;
gbc.insets = new Insets(0, 2, 0, 2);
displayPanel.add(nosePanel, gbc);
displayPanel.add(mainPanel, gbc);

请注意,我根本没有设置 gridx、gridy、gridwidth 或 gridheight。默认情况下,gridwidth 和 gridheight 已经是 1。gridx 和 gridy 默认为GridBagConstraints.RELATIVE,这恰好可以满足您的要求:它会自动将每个新组件添加到同一行,除非将 gridwidth 或 gridheight 更改为REMAINDER,在这种情况下(分别)将新的行或列为下一个相对放置的组件启动。

于 2015-10-26T20:30:19.917 回答