【发布时间】:2014-01-27 10:44:43
【问题描述】:
我正在设计一个包含 20 个左右组件的 GUI:10 个标签、4 个文本字段、4 个按钮和 2 个文本区域。使用 GridBagLayout 似乎是个好主意。但是由于本书要求为每个组件执行所有实例变量(即不重用),添加组件的通用方法似乎是必须的。我真的认为这可行:
(注意:HORIZ 是 GridBagConstraints.HORIZONTAL 的缩写; CENTER 是 GridBagConstraints.CENTER 的缩写。)
public static void addComponent(Container f, Component c,
int x, int y,
int w, int h,
int ipadx, int ipady,
float wtx, float wty,
int fill, int anchor, Insets insets){
GridBagConstraints gbc = new GridBagConstraints();
gbc.gridx = x; gbc.gridy = y;
gbc.gridwidth = w; gbc.gridheight = h;
gbc.fill = fill;
gbc.ipadx = ipadx; gbc.ipady = ipady;
gbc.insets = insets; gbc.anchor = anchor;
gbc.weightx = wtx; gbc.weighty = wty;
f.add(c,gbc);
}
我这样称呼它:
Insets insets = new Insets(0,0,0,0);
JFrame frame = new JFrame();
label = new JLabel("Blablablah");
addComponent(frame, label, 0,0, 1,1, 0,0, 0.5f,0, HORIZ, CENTER, insets);
但我在f.add(c.gbc) 收到消息“无法添加到布局:约束必须是字符串(或 null)”。
我想我理解错误:frame 在调用addComponent 之前没有GridBagConstraints 和gbc 在方法的第一行不属于参数f(或还有什么?)。
所以我稍微修改了方法签名,省略了Container:
public static void addComponent( Component c,
int x, int y,
... (rest unchanged)
我修改了问题行如下:
frame.add(c, gbc);
所以我使用全局变量frame,而我宁愿将它作为参数传递。
两个问题:
(1) 有没有办法对我的代码进行最低限度的修改,以便将frame 传递给addComponent?
(2) 有什么理由想要这样做吗?我想这相当于问,你会怎么做?
附:这是对修改后的addComponent 的调用,匆忙拼凑在一起以获得我想要的前几行的一些相似之处。间距现在很臭——我需要用插图、ipad、填充来玩弄——但它实际上是可用的。 (frame 的新名称是 GUI。)
private static void createAndShowGUI() {
GUI = new JFrame();
GUI.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
gbl = new GridBagLayout();
GUI.setLayout(gbl);
addComponent(lblRootNode, 0,0, 1,1, 0,0, 0.5f,0, HORIZONTAL, CENTER, new Insets(0,0,0,0));
addComponent(txtRootNode, 1,0, 5,1, 60,0, 0.5f,0, HORIZONTAL, CENTER, new Insets(0,0,0,0));
addComponent(btnBrowse, 6,0, 1,1, 0,0, 0.5f,0, HORIZONTAL, CENTER, new Insets(0,0,0,0));
addComponent(lblFilenamePat, 0,1, 2,1, 0,0, 0.5f,0, HORIZONTAL, EAST, new Insets(0,0,0,0));
addComponent(txtFilenamePat, 2,1, 4,1, 0,0, 0.5f,0, HORIZONTAL, LINE_END, new Insets(0,0,0,0));
addComponent(lblDates, 0,2, 2,1, 0,0, 0.5f,0, HORIZONTAL, CENTER, new Insets(0,0,0,0));
addComponent(lblSizes, 2,2, 2,1, 0,0, 0.5f,0, HORIZONTAL, CENTER, new Insets(0,0,0,0));
...
【问题讨论】:
-
如需尽快获得更好的帮助,请发帖 SSCCE。请注意,该文档正在this question 上进行审核和讨论,欢迎投稿。
-
检查了几个相关的例子here。
标签: java swing layout-manager gridbaglayout