0

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

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

它起初工作,但现在即使第一个文本字段为空,第二个获得焦点,在此之后一切都挂起,我认为可能存在一些并发问题......请解释原因并帮助我解决

4

1 回答 1

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("");
        }
    }
}
于 2013-05-07T15:20:38.233 回答