Java Swing JTextField setInputVerifier 保持对 TextField 的关注

Java Swing JTextField setInputVerifier keep focus on TextField

我有一个 public class JdbDateTextField extends JTextField,在构造函数中我添加了 this.setInputVerifier(new ValidDateOrEmptyVerifier());

我使用class ValidDateOrEmptyVerifier extends InputVerifier来验证输入的格式。

如果输入格式错误,用户失去了 JdbDateTextField 的焦点,我 return falseValidDateOrEmptyVerifier 中获得了焦点又到JdbDateTextField了。

如果用户从 JdbDateTextField 切换到另一个文本字段或按下按钮,这将起作用。如果按下按钮并且输入的格式错误,则不会执行该按钮的任何操作并且焦点仍位于 JdbDateTextField.

这正是我想要的。在输入有效字符串之前,用户不能离开 JdbDateTextField

问题是 JdbDateTextField 在 JPanel 中,而 JPanel 在 JTabbedPane 中,所以我有一个带有多个选项卡的 GUI。

如果我选择了JdbDateTextField,输入了无效的输入,然后直接点击另一个选项卡,它仍然会切换选项卡。所以我能够提供错误的输入。

我的问题是:

有没有办法执行输入验证,在 true

之前不允许执行任何其他事件

我能想到的最佳解决方案是为 JTabbedPane 分配一个自定义选择模型,该模型拒绝允许更改选项卡,除非当前 InputVerifier 成功:

int index = tabbedPane.getSelectedIndex();

tabbedPane.setModel(new DefaultSingleSelectionModel() {
    @Override
    public void setSelectedIndex(int index) {
        Component focusOwner =
            FocusManager.getCurrentManager().getFocusOwner();

        if (focusOwner instanceof JComponent) {
            JComponent c = (JComponent) focusOwner;
            InputVerifier verifier = c.getInputVerifier();
            if (verifier != null && !verifier.shouldYieldFocus(c)) {
                return;
            }
        }

        super.setSelectedIndex(index);
    }
});

tabbedPane.setSelectedIndex(index);

我希望我能做到这一点作为答案:

上述解决方案适用于 JTabbedPane

但我仍然可以 select 其他 GUI 元素。

我的应用程序是这样构建的:

对于每个 Person ID,我在 JTabbedPane 中显示其他 Birthdate 个值 我仍然可以切换到另一个 Person ID 如果 ValidDateOrEmptyVerifier returns false.

那么有没有办法禁止主框架中的所有事件,直到 ValidDateOrEmptyVerifier returns true.

所以基本上我想要的是用户只有在输入有效日期或字段为空时才能退出 "Birthdate" JdbDateTextField