java中JTextField输入的字符如何进行判断非法输入

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了java中JTextField输入的字符如何进行判断非法输入相关的知识,希望对你有一定的参考价值。

参考技术A 这就要看你用的什么触发事件了。
如果是用的输入时触发键盘触发事件,你可以获取你的按键名字,然后给个if判断,按下那些字符会给提示框便可
如果用的其他触发事件,比如焦点事件、鼠标事件等。你可以获取jtextfield
的内容,然后正则表达式匹配一下就可以了。
一般推荐
焦点事件或键盘事件,焦点不在那个输入框了或者每次摁下键盘的时候,立刻进行判断。

多个 JTextfield 的空字符串验证

【中文标题】多个 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 的参数是什么?第一行

以上是关于java中JTextField输入的字符如何进行判断非法输入的主要内容,如果未能解决你的问题,请参考以下文章

如何只允许在 Java 中的 JTextField 中浮动

java中如何实现在jtextfield中输入多行文字

多个 JTextfield 的空字符串验证

JAVA中如何判断JTextField的一些问题?求高手解答……谢谢

是否可以使用 jtextfield 和 Jlist 进行自动完成?

Java JTextField 空字符串错误