繁体   English   中英

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 ,我返回falseValidDateOrEmptyVerifier和焦点再次上涨到JdbDateTextField一次。

如果用户从JdbDateTextField切换到另一个textField或按下Button,则此方法有效。 如果按下按钮并且输入的格式错误,则不执行该按钮的操作,焦点仍然在JdbDateTextField

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

问题是JdbDateTextField位于JTabbedPane中的JPanel中,所以我有一个带有几个选项卡的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

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

我的应用程序是这样构建的: 在此输入图像描述

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

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

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM