【问题标题】:Add FocusListener on a JTextField在 JTextField 上添加 FocusListener
【发布时间】:2013-11-14 11:12:08
【问题描述】:

我有一个文本字段,我必须在其中验证电子邮件。我的问题是我只想在电子邮件有效时才将焦点从文本字段移开。我现在使用的是 FocusAdapter。 有人可以给我一些其他的想法吗?

【问题讨论】:

  • 我不希望不得不使用这样的程序。例如。我坐在一个有 30 个字段的屏幕前,知道其中 29 个字段的值,但第 30 个字段是我需要从我的同事那里得到的电子邮件地址,他在外面突然冒出来抽烟。为什么限制我输入我知道的 29 个字段的详细信息? “..给我一些其他的想法?”当操作员尝试保存信息时验证所有字段。如果有需要的字段修复,弹出一个模式对话框,解释所需数据并将它们放回表单中,以字段为中心。

标签: java swing listener jtextfield


【解决方案1】:

javax.swing.InputVerifierJComponent.setInputVerifier() 但不要忘记安德鲁的建议。您的工作流程对用户不友好。

这里已经描述过:Java - making a textbox not lose focus

【讨论】:

    【解决方案2】:

    试试这个:

    public static boolean isValidEmailAddress(String email)
    {
       boolean result=true;
       try
       {
          InternetAddress emailAddr=new InternetAddress(email);
          emailAddr.validate();
       } catch(AddressException ex)
       {
          result=false;
       }
       return result;
    }
    

    【讨论】:

    • 我已经验证了电子邮件。我的问题是:当我在 TextField 中输入一些无效的电子邮件并将鼠标移到另一个组件上时,我需要鼠标不能这样做,但要留在同一个文本字段上,直到电子邮件有效。
    【解决方案3】:

    在下一个示例中,如果验证失败,您将无法移动到另一个字段,这是在 requestFocusInWindow() 方法的帮助下完成的。试试吧,我觉得对你有帮助:

    public class Frame extends JFrame {
    
        private JTextField f;
        private JTextField f2;
        private JTextField f3;
    
        public Frame() {
            f = new JTextField(5);
            f2 = new JTextField(5);
            f3 = new JTextField(5);
            f.addFocusListener(getFocusListener());
            getContentPane().setLayout(new GridLayout(3,1,5,5));
            getContentPane().add(f);
            getContentPane().add(f2);
            getContentPane().add(f3);
            pack();
            setDefaultCloseOperation(EXIT_ON_CLOSE);
            setVisible(true);
        }
    
        private FocusListener getFocusListener() {
            return new FocusAdapter() {
                @Override
                public void focusLost(FocusEvent arg0) {
                    super.focusLost(arg0);
                    if(!validateEmail()){
                        f.requestFocusInWindow();
                    }
                }
            };
        }
    
        private boolean validateEmail() {
            return f.getText().length()<3;
        }
    
        public static void main(String args[]) {
            new Frame();
    
        }
    
    }
    

    阅读更多关于requestFocusInWindow()How to Use the Focus Subsystem的信息

    【讨论】:

      猜你喜欢
      • 2013-11-03
      • 1970-01-01
      • 2012-06-30
      • 1970-01-01
      • 2018-01-28
      • 2013-06-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多