6

有没有办法在没有 if else 结构的情况下验证 java 中的许多 JTextfields。我有一组 13 个字段,当没有为 13 个字段中的任何一个提供条目并且能够将焦点设置到该特定文本框时,我想要一条错误消息。这是为了防止用户将空数据输入数据库。有人可以告诉我如何在没有下面的 if else 结构的情况下实现这一点。

if (firstName.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (lastName.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (emailAddress.equals("")) {
    JOptionPane.showMessageDialog(null, "No data entered");
} else if (phone.equals("")) {
   JOptionPane.showMessageDialog(null, "No data entered");
} else {
 //code to enter values into MySql database

上面的代码属于提交注册按钮的actionperformed方法a。尽管将 MySQL 中的字段设置为 NOT NULL,但仍从 java GUI 接受空字符串。为什么是这样?我希望可能会引发一个空字符串异常,我可以从中自定义验证消息,但由于接受了空字段,因此无法这样做。

谢谢

4

4 回答 4

6

只是为了好玩一点手指抽动演示了一个可重复使用的验证设置,它确实使用了核心 Swing 中可用的功能。

合作者:

  • InputVerifier 包含验证逻辑。在这里,它只是在验证字段中检查空文本。注意
    • 验证不能有副作用
    • shouldYieldFocus 被覆盖以不限制焦点遍历
    • 所有文本字段都是相同的实例
  • 一个提交动作,它通过显式调用 inputVerifier(如果有)来检查其父级的所有子级的有效性,如果有任何无效则不执行任何操作
  • 一种非常简单但普遍可用的错误消息的机制,采用输入字段的标签

一些代码片段

// a reusable, shareable input verifier
InputVerifier iv = new InputVerifier() {

    @Override
    public boolean verify(JComponent input) {
        if (!(input instanceof JTextField)) return true;
        return isValidText((JTextField) input);
    }

    protected boolean isValidText(JTextField field) {
        return field.getText() != null && 
                !field.getText().trim().isEmpty();
    }

    /**
     * Implemented to unconditionally return true: focus traversal
     * should never be restricted.
     */
    @Override
    public boolean shouldYieldFocus(JComponent input) {
        return true;
    }

};
// using MigLayout for lazyness ;-)
final JComponent form = new JPanel(new MigLayout("wrap 2", "[align right][]"));
for (int i = 0; i < 5; i++) {
    // instantiate the input fields with inputVerifier
    JTextField field = new JTextField(20);
    field.setInputVerifier(iv);
    // set label per field
    JLabel label = new JLabel("input " + i);
    label.setLabelFor(field);
    form.add(label);
    form.add(field);
}

Action validateForm = new AbstractAction("Commit") {

    @Override
    public void actionPerformed(ActionEvent e) {
        Component source = (Component) e.getSource();
        if (!validateInputs(source.getParent())) {
            // some input invalid, do nothing
            return;
        }
        System.out.println("all valid - do stuff");
    }

    protected boolean validateInputs(Container form) {
        for (int i = 0; i < form.getComponentCount(); i++) {
            JComponent child = (JComponent) form.getComponent(i);
            if (!isValid(child)) {
                String text = getLabelText(child);
                JOptionPane.showMessageDialog(form, "error at" + text);
                child.requestFocusInWindow();
                return false;
            }
        }
        return true;
    }
    /**
     * Returns the text of the label which is associated with
     * child. 
     */
    protected String getLabelText(JComponent child) {
        JLabel labelFor = (JLabel) child.getClientProperty("labeledBy");
        return labelFor != null ? labelFor.getText() : "";
    }

    private boolean isValid(JComponent child) {
        if (child.getInputVerifier() != null) {
            return child.getInputVerifier().verify(child);
        }
        return true;
    }
};
// just for fun: MigLayout handles sequence of buttons 
// automagically as per OS guidelines
form.add(new JButton("Cancel"), "tag cancel, span, split 2");
form.add(new JButton(validateForm), "tag ok");
于 2012-12-26T14:14:24.913 回答
5

有多种方法可以做到这一点,一种是

 JTextField[] txtFieldA = new JTextField[13] ;
 txtFieldFirstName.setName("First Name") ; //add name for all text fields
 txtFieldA[0] = txtFieldFirstName ;
 txtFieldA[1] = txtFieldLastName ;
 ....

 // in action event
 for(JTextField txtField : txtFieldA) {
   if(txtField.getText().equals("") ) {
      JOptionPane.showMessageDialog(null, txtField.getName() +" is empty!");
      //break it to avoid multiple popups
      break;
   }
 }

另请查看JGoodies Validation,该框架可帮助您验证 Swing 应用程序中的用户输入,并帮助您报告验证错误和警告。

于 2012-12-25T17:50:36.530 回答
4

取这三个JTextField的数组,我给出一个概述

JTextField[] fields = new JTextField[13] 
field[0] = firstname;
field[1] = lastname; //then add remaining textfields

for(int i = 0; i < fields.size(); ++i) {
if(fields[i].getText().isEmpty())
   JOptionPane.showMessageDialog(null, "No data entered");
}

如果我错了,请纠正我,我不熟悉 Swing 或 awt.HTH :)

于 2012-12-25T17:49:07.620 回答
2

这是一种方法:

public static boolean areAllNotEmpty(String... texts)
{
    for(String s : texts) if(s == null || "".equals(s)) return false;
    return true;
}

// ...

if(areAllNotEmpty(firstName, lastName, emailAddress, phone))
{
    JOptionPane.showMessageDialog(null, "No data entered");
}
于 2012-12-25T17:48:24.627 回答