多个 JTextfield 的空字符串验证

Posted

技术标签:

【中文标题】多个 JTextfield 的空字符串验证【英文标题】:Empty String validation for Multiple JTextfield 【发布时间】:2012-12-11 13:11:09 【问题描述】:

有没有一种方法可以在没有 if else 结构的情况下验证 java 中的多个 JTextfield。我有一组 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 接受空字符串。为什么是这样?我希望可能会引发一个空字符串异常,我可以从中自定义验证消息,但由于接受了空字段,因此无法这样做。

谢谢

【问题讨论】:

使用DocumentListener,并更改Background Color,而不是使用JOptionPane 【参考方案1】:

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

合作者:

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

一些代码sn-ps

// 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");

【讨论】:

@Reimeus InputVerifier 不是一个坏主意 - 只是不要限制 focusTraversal 并将其用作验证组件的规则 :-)【参考方案2】:

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

 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 应用程序中的用户输入并帮助您报告验证错误和警告。

【讨论】:

【参考方案3】:

拿这三个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 :)

【讨论】:

@MuminAli 与私有无关,你在该类之外使用吗? 字段 = firstname,lastname...;是非法的表达开始。由于firstname,lastname不是Jtextfield[]类型,需要swing.Jtextfield[],找到swing JTextfield。 在方法中,但在与声明文本字段相同的类中 @MuminAli 尝试在一行中初始化,因为我已经编辑了我的答案。 java 不允许这样做,我将它们单独放入字段 [0] = firstname;这是允许的【参考方案4】:

这是一种方法:

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");

【讨论】:

"".equals(s)hmmm 三元 @mKorbel 你是什么意思? :) "".equals(s) 可能有用,null 应该被忽略 areALLNotEmpty 的参数是什么?第一行

以上是关于多个 JTextfield 的空字符串验证的主要内容,如果未能解决你的问题,请参考以下文章

2021-10-12:验证回文串。给定一个字符串,验证它是否是回文串,只考虑字母和数字字符,可以忽略字母的大小写。说明:本题中,我们将空字符串定义为有效的回文串 。输入: “A man, a plan

JS验证字符串是否以某一子串结尾,验证字符串是否以某一子串开始

LeetCode-125-验证回文串

LeetCode:验证回文串125

leetcode.字符串.125验证回文串-Java

LeetCode(125):验证回文串