Java Swing JTextField setInputVerifier 如何使文本框保持焦点

3
我有一个public class JdbDateTextField扩展自JTextField,在构造函数中我添加了this.setInputVerifier(new ValidDateOrEmptyVerifier())。
我使用class ValidDateOrEmptyVerifier扩展自InputVerifier来验证输入的格式。
如果输入格式不正确并且用户失去对JdbDateTextField的焦点,我会在ValidDateOrEmptyVerifier中返回false,并且焦点再次回到JdbDateTextField。
当用户从JdbDateTextField切换到另一个textField或按下按钮时,这样就可以工作。如果按下按钮并且输入的格式错误,则不执行任何操作且焦点仍停留在JdbDateTextField。
这正是我想要的。用户只能在输入有效字符串之前无法离开JdbDateTextField。
问题是JdbDateTextField位于JPanel中,该JPanel位于JTabbedPane中,因此我具有带有多个选项卡的GUI。
如果我选择了JdbDateTextField,输入无效数据,然后直接单击其他选项卡,它仍会切换选项卡。所以我能够提供错误的输入。
我的问题是:
是否有一种输入验证方法可以在变为true之前不允许执行任何其他事件?
2个回答

3
我能想到的最佳解决方案是为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);

0
希望我可以作为答案来解决这个问题:
上述的解决方案适用于 JTabbedPane 但我仍然可以选择其他 GUI 元素。
我的应用程序是这样构建的: enter image description here 对于每个人员 ID,我在 JTabbedPane 中显示其他出生日期值, 如果 ValidDateOrEmptyVerifier 返回 false,我仍然可以切换到另一个人员 ID。
所以有没有一种方法可以禁止主窗口中的所有事件,直到 ValidDateOrEmptyVerifier 返回 true。
因此,基本上我想要的是,只有在用户输入有效日期或字段为空时,才能退出“Birthdate”JdbDateTextField。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接