【问题标题】:Java Swing Complex Form - SpringLayoutJava Swing 复杂表单 - SpringLayout
【发布时间】: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


【解决方案1】:

我最终使用 SpringLayout 完成了这项工作,每行有两个面板。左侧面板包含标签,右侧包含输入字段。这似乎运作良好:

    for (Parameter p : params) {
        // The label for this parameter
        JLabel pname = new JLabel(p.getName() + ": ", JLabel.TRAILING);

        // Setup the sub panels for this layout, aligned to point each other
        JPanel pnlLeft = new JPanel(new FlowLayout(FlowLayout.RIGHT));
        JPanel pnlRight = new JPanel(new FlowLayout(FlowLayout.LEFT));

        // The value field for this parameter, depends on param type
        if (p.getType().equals("filename")) {
            JButton btnBrowse = new JButton("Browse");
            btnBrowse.setActionCommand(pfilepath + p.getId());
            btnBrowse.addActionListener(this);
            JTextField pvalue = new JTextField(p.getValue(),50);
            pnlRight.add(pvalue);
            pnlRight.add(btnBrowse);
        } else if (p.getType().equals("directory")) {
            JButton btnBrowse = new JButton("Browse");
            btnBrowse.setActionCommand(pdirpath + p.getId());
            btnBrowse.addActionListener(this); 
            JTextField pvalue = new JTextField(p.getValue(),50);               
            pnlRight.add(pvalue);
            pnlRight.add(btnBrowse);            
        } else if (p.getType().equals("textbox")) {
            JTextField pvalue = new JTextField(p.getValue(),50);
            pnlRight.add(pvalue);            
        } else if (p.getType().equals("checkbox")) {
            for(String option : p.getSelections()){
                JCheckBox chkbox = new JCheckBox(option);
                if (p.getValue().contains(option)){
                    chkbox.setSelected(true);
                }
                chkbox.setName(p.getId() + "_" + option);
                chkbox.setActionCommand(pchkbox + p.getId() + "_" + option);
                chkbox.addActionListener(this);
                pnlRight.add(chkbox);
            }
        } else if (p.getType().equals("radio")) {
            ButtonGroup bgRadios = new ButtonGroup();
            for(String option : p.getSelections()){
                JRadioButton radio = new JRadioButton(option);
                if (p.getValue().equals(option)){
                    radio.setSelected(true);
                }
                radio.setName(p.getId() + "_" + option);
                radio.setActionCommand(pradio + p.getId() + "_" + option);
                radio.addActionListener(this);                    
                bgRadios.add(radio);
                pnlRight.add(radio);
            }
        } else {
            JTextField pvalue = new JTextField(p.getValue(),50);
            pvalue.setText("ERROR! Invalid global parameter type!" + p.getType());
            pvalue.setEditable(false);
            pnlRight.add(pvalue);
        }

        // Add subpanels to this main panel and set labeling
        pnlLeft.add(pname);
        pname.setLabelFor(pnlRight);
        add(pnlLeft);
        add(pnlRight);
    }

    // Correctly setup SpringLayout grid for this main panel
    SpringUtilities.makeCompactGrid(this, 
            params.size(), 2, //rows, cols
            1, 1,  //initX, initY
            1, 1); //xPad, yPad

【讨论】:

    猜你喜欢
    • 2018-09-28
    • 1970-01-01
    • 1970-01-01
    • 2021-06-17
    • 2023-04-08
    • 1970-01-01
    • 1970-01-01
    • 2017-04-27
    • 2017-09-23
    相关资源
    最近更新 更多