【发布时间】:2013-08-15 00:17:14
【问题描述】:
我需要帮助来创建一个 Java swing 表单。表单是动态创建的,并要求用户提供各种输入。输入各不相同,可能是文本字段、单选按钮、组合框。我正在尝试确定这种表单的最佳布局是什么。目前,我有类似的东西:
JPanel pnlForm = new JPanel(new SpringLayout());
for (Parameter p : globals) {
JLabel lblName = new JLabel(p.getName() + ": ", JLabel.TRAILING);
pnlForm.add(lblName);
// The input field depends on parameter type
if (p.getType().equals("filename")) {
JPanel pnlFileChooser = new JPanel();
JTextArea txtArea = new JTextArea(p.getValue());
JButton btnFileChooser = new JButton("Browse");
pnlFileChooser.add(txtArea);
pnlFileChooser.add(btnFileChooser);
pnlForm.add(pnlFileChooser);
} else if (p.getType().equals("textbox")) {
JTextArea txtArea = new JTextArea(p.getValue());
pnlForm.add(txtArea);
} else if (p.getType().equals("checkbox")) {
// not yet implemented
} else if (p.getType().equals("radio")) {
ButtonGroup bgRadios = new ButtonGroup();
for(String option : p.getSelections()){
JRadioButton btnOption = new JRadioButton(option);
btnOption.setMnemonic(KeyEvent.VK_B);
btnOption.setActionCommand(option);
bgRadios.add(btnOption);
pnlForm.add(btnOption);
}
} else {
JLabel lblError = new JLabel("ERROR! Unknown type!" + p.getType());
lblName.setLabelFor(lblError);
pnlForm.add(lblError);
}
//Lay out the panel.
SpringUtilities.makeCompactGrid(pnlDetails,
globals.size() - 1, 2, //rows, cols
1, 1, //initX, initY
5, 5); //xPad, yPad
这目前非常不稳定(单选按钮不会留在同一区域)。有什么想法可以让这个布局变得更好吗?
谢谢!
[编辑]
添加下图以了解这可能是什么样子。灰线可以忽略,只是用来显示 JPanel 可能在哪里。每一行都是根据一些用户输入动态生成的。我怎样才能做出这样的表格?
【问题讨论】:
-
GridBagLayout 非常适合由多行组成的布局,每行包含一个标签和一个字段。它有点难学,但是一旦你理解了它就很容易使用。而且我发现它的行为比 SpringLayout 更可预测。
-
如果您真的需要整体布局方面的帮助,我们必须知道您想要做什么。这段代码不足以让我们知道。每个人都有自己最喜欢的布局管理器(我自己也很喜欢 GroupLayout),但除了告诉你一个或另一个会做你想做的事情之外,很难看到我们能做什么。
-
我添加了一个图表来显示我想要获取的表单类型。请问还有什么想法吗?再次感谢!
-
有人可以帮忙吗?我如何碰到这个线程?
标签: java forms swing springlayout