如何处理 GridBagConstraints 的许多不同插图?

How to deal with many different insets for GridBagConstraints?

Java 摆动:

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

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

等..

以及我的 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 值。 (我正在尝试重构以使其更 readable/reusable)。

  2. 实际上,我可能不得不添加更多的插图预设,这将使问题 1 复杂化。

当您将组件添加到 GridBagLayout 时,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);

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

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

我倾向于以这种方式为 "groups" 个组件使用单个实例。

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

正如 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, which happens to do exactly what you want: it automatically adds each new component on the same row, unless gridwidth or gridheight is changed to REMAINDER,在这种情况下,将为下一个相对放置的组件启动新的行或列(分别)。