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语句?我目前的方法出现了几个问题。
我开始忘记将哪些插入分配给z的哪个值。 (我试图重构以使其更具可读性/可重用性。)
我实际上可能需要添加更多的插入预设,这将使问题1复杂化。
答案 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,在这种情况下为新行将为下一个相对放置的组件启动或(分别)列。