Java焦点遍历到新禁用的按钮

Java焦点遍历到新禁用的按钮,java,validation,button,focus,Java,Validation,Button,Focus,我对Java中的焦点遍历系统有一个问题。当我在应用程序窗格中的组件之间进行tab时,“一切正常”选项卡将焦点移动到下一个组件 我的一些组件在失去焦点时执行验证,如果验证返回错误,则屏幕保存按钮被禁用 当验证的组件后面跟着“保存”按钮时,就会出现我的问题 选项卡从已验证的组件中移除焦点,并开始异步过程,将焦点分配给通过“保存”按钮启用的下一个组件 接下来,我的验证开始并禁用“保存”按钮 异步过程随后完成,并尝试将焦点分配给现在已禁用的保存按钮 焦点现在被捕获,并且制表符不再移动焦点,因为实际上没有

我对Java中的焦点遍历系统有一个问题。当我在应用程序窗格中的组件之间进行tab时,“一切正常”选项卡将焦点移动到下一个组件

我的一些组件在失去焦点时执行验证,如果验证返回错误,则屏幕保存按钮被禁用

当验证的组件后面跟着“保存”按钮时,就会出现我的问题

选项卡从已验证的组件中移除焦点,并开始异步过程,将焦点分配给通过“保存”按钮启用的下一个组件

接下来,我的验证开始并禁用“保存”按钮

异步过程随后完成,并尝试将焦点分配给现在已禁用的保存按钮

焦点现在被捕获,并且制表符不再移动焦点,因为实际上没有组件具有焦点


如果其他人遇到此问题,您是如何解决在焦点遍历事件开始之前执行验证和禁用的问题的?

您可以使用InputVerifier验证文本字段。在这种情况下,焦点将错误地放回文本字段

或者你可以改变你的焦点听众来处理这种情况。比如:

FocusListener fl = new FocusAdapter()
{
    public void focusLost(final FocusEvent e)
    {
        JTextField tf = (JTextField)e.getSource();

        if (tf.getDocument().getLength() < 1)
        {
            System.out.println("Error");
            button.setEnabled( false );

            Component c =  e.getOppositeComponent();

            if (c instanceof JButton
            &&  c.isEnabled() == false)
            {
                tf.requestFocusInWindow();
            }
        }
        else
            button.setEnabled( true );
    }
};