jTextFields请求焦点(如果lostFocus后为空)不起作用

时间:2013-05-07 15:07:49

标签: java swing user-interface focus

我有2个jTextFields并且都有一个lostFocus事件的监听器,如果第一个文本字段丢失焦点并且为空,我希望它重新获得焦点,而第二个字段几乎相同。 我试过这个:

String str = MyTextField.getText();
if (str.isEmpty()) 
    MyTextField.requestFocusInWindow();
else ...

并且它起初工作,但现在即使第一个文本字段为空,第二个文本字段为焦点,在此之后一切都挂起,我想也许有一些并发问题...请解释原因并帮助我解决方案< / p>

1 个答案:

答案 0 :(得分:1)

使用 InputVerifier

来自javadocs,

  

只要组件即将失去焦点,就会咨询组件的输入验证程序。如果组件的值不可接受,则输入验证程序可以采取适当的操作,例如拒绝在组件上产生焦点或用最后一个有效值替换用户的输入然后允许焦点转移到下一个组件。但是,当焦点转移到另一个顶级组件时,InputVerifier

以下是基于您的示例代码,如果文本字段为空,则会阻止标记到其他文本字段

import javax.swing.*;
import java.awt.*;

public class FoucsDemo
{
    public static void main(String[] args)
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            @Override
            public void run()
            {
                new FoucsDemo();
            }
        });

    }

    FoucsDemo()
    {
        JFrame jFrame=new JFrame("Input Verifier");
        jFrame.setLayout(new GridLayout(2,1,1,5));
        JTextField jTextField1=new JTextField(10);
        JTextField jTextField2=new JTextField(10);
        jTextField1.setInputVerifier(new Verify());
        jTextField2.setInputVerifier(new Verify());
        jFrame.add(jTextField1);
        jFrame.add(jTextField2);
        jFrame.pack();
        jFrame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        jFrame.setVisible(true);
    }

    class Verify extends InputVerifier
    {
        @Override
        public boolean verify(JComponent input)
        {
            return !((JTextField) input).getText().equals("");
        }
    }
}