【问题标题】:Textfield Validation in Java using LostFocus event使用 LostFocus 事件在 Java 中验证文本字段
【发布时间】:2013-09-10 05:52:57
【问题描述】:

我正在使用 LostFocus 事件验证两个文本字段,如下所示:

textRegNo.addFocusListener(new FocusListener() {            
        @Override
        public void focusLost(FocusEvent arg0) {
            // TODO Auto-generated method stub
            regNo1=textRegNo.getText();
            Pattern pattern1 = Pattern.compile("^[A-Z]{2}[ -][0-9]{1,2}(?: [A-Z])?(?: [A-Z]*)? [0-9]{4}$");
            Matcher matcher1 = pattern1.matcher(regNo1);

            if (!matcher1.find()){
                JOptionPane.showMessageDialog(null, "Invalid Vehicle No!!!\n Vehicle no should be of the form MH 03 KS 2131!!");
            }                           
        }
        @Override
        public void focusGained(FocusEvent arg0) {
            // TODO Auto-generated method stub

        };
    }); 


textMobNo.addFocusListener(new FocusListener() {            
        @Override
        public void focusLost(FocusEvent arg0) {
            // TODO Auto-generated method stub
            mobNo1=textMobNo.getText();
            Pattern pattern2 = Pattern.compile("^[789]\\d{9}$");
            Matcher matcher2 = pattern2.matcher(mobNo1);

            System.out.println("'"+mobNo1+"'");
            if (!matcher2.find()){
                JOptionPane.showMessageDialog(null, "Phone no must be a 10 digit number!!");
            }                           
        }

        @Override
        public void focusGained(FocusEvent arg0) {
            // TODO Auto-generated method stub

        };
    });

我的问题是,当我失去对第一个文本字段的关注并将焦点移动到第二个文本字段时,两个字段都会打印错误消息(两个 lostfocus 事件下的 IF 块内的 MESSAGE。) 当我在第一个文本字段中输入错误并将焦点移动到第二个字段时,它应该只打印第一个文本字段的错误消息。但两者的打印错误。

第一个文本字段是 textRegNo 第二个文本字段是 textMobNo

【问题讨论】:

  • 尝试使用InputVerifier代替焦点监听器来验证字段...
  • 问题的症状围绕着这个过程。 textMobNo 获得焦点,导致 textRegNo 失去焦点,textRegNo 被验证并发现无效,textRegNo 现在显示错误消息...textMobNo 失去焦点(因为对话框获得焦点)
  • 您能就您刚才解释的问题提出任何解决方案吗?欣赏!
  • 是的,使用InputVerifer,这就是他们的目的......
  • 好的!我会看看!感谢您的帮助!

标签: java regex swing validation lostfocus


【解决方案1】:

问题的症状围绕着这个过程。

  1. textMobNo 获得关注...
  2. 导致textRegNo失去焦点...
  3. textRegNo 已验证并发现无效,textRegNo 现在显示错误消息...
  4. 焦点转移到对话框并...
  5. textMobNo 失去焦点(因为对话框获得焦点)

如果可以的话,您应该避免使用焦点来验证字段,而是使用InputVerifier

简单示例

import java.awt.EventQueue;
import java.awt.GridBagConstraints;
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.InputVerifier;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
import javax.swing.text.JTextComponent;

public class TestInputVerifier {

    public static void main(String[] args) {
        new TestInputVerifier();
    }

    public TestInputVerifier() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
                    ex.printStackTrace();
                }

                JFrame frame = new JFrame("Testing");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });
    }

    public class TestPane extends JPanel {

        public TestPane() {
            GridBagConstraints gbc = new GridBagConstraints();
            gbc.gridwidth = GridBagConstraints.REMAINDER;
            JTextField field = new JTextField(20);
            field.setInputVerifier(new RegExpInputVerifier("^[A-Z]{2}[ -][0-9]{1,2}(?: [A-Z])?(?: [A-Z]*)? [0-9]{4}$"));
            add(field, gbc);

            field = new JTextField(20);
            field.setInputVerifier(new RegExpInputVerifier("^[789]\\d{9}$"));
            add(field, gbc);
        }

    }

    public class RegExpInputVerifier extends InputVerifier {

        private String expression;

        public RegExpInputVerifier(String expression) {
            this.expression = expression;
        }

        public String getExpression() {
            return expression;
        }

        @Override
        public boolean verify(JComponent input) {
            boolean verified = false;
            if (input instanceof JTextComponent) {
                JTextComponent field = (JTextComponent) input;
                String regNo1 = field.getText();
                Pattern pattern1 = Pattern.compile(expression);
                Matcher matcher1 = pattern1.matcher(regNo1);
            }
            return verified;
        }
    }
}

【讨论】:

  • 你能给我一个在我的代码中使用正则表达式的 InputVerifier 示例吗?我愿意使用匿名类。我不确定如何在 InputVerifier 中使用正则表达式。
  • 这很简单。您从focusLost 获取代码并将其放入verifyInputVerifier
  • 所以...我们正在使用 InputVerifier 但问题是当您选择另一个窗口时,该事件永远不会触发,因此该字段不会及时得到验证。可以做些什么来防止这种情况发生?有人能以某种方式触发来自 focusLost 事件的验证吗?这些事件似乎总是在人们选择另一个窗口时被触发。
  • 您“可以”尝试的唯一方法是强制验证的 FocudListener
  • @DeanStrydom 您面临的问题归结为这样一个事实,即窗口焦点的更改仅被视为“临时”焦点丢失,这意味着输入验证不会触发。问题是,您为什么要以这种方式对其进行验证?为什么用户不需要回来继续他们的数据输入或选择一些“操作”按钮来“提交”值?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-11-08
  • 1970-01-01
  • 1970-01-01
  • 2017-09-19
  • 2013-04-03
  • 2011-11-09
  • 2011-12-15
相关资源
最近更新 更多