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

时间:2015-10-26 20:02:44

标签: java swing layout-manager gridbaglayout insets

Java Swing:

我创建了一个返回GridBagConstraints的方法,这样我就不需要经常调用新的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;
}

我的问题是:是否有更好的方法来处理许多不同的插图而不仅仅是做大量的其他if语句?我目前的方法出现了几个问题。

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

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

2 个答案:

答案 0 :(得分: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);

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

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

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

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

答案 1 :(得分: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,在这种情况下为新行将为下一个相对放置的组件启动或(分别)列。