Java Swing JTextField setInputVerifier继续关注TextField

时间:2015-12-16 15:17:47

标签: java swing inputverifier

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

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

如果输入的格式错误且用户失去了JdbDateTextField的焦点,我会在false中返回ValidDateOrEmptyVerifier并重新获得焦点{{1}再次。

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

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

问题是JdbDateTextField位于JdbDateTextField的JPanel中,因此我有一个带有多个标签的GUI。

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

我的问题是:

有没有办法执行输入验证,它不允许在JdbDateTextField之前执行任何其他事件

2 个答案:

答案 0 :(得分: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);

答案 1 :(得分:0)

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

上述解决方案适用于JTabbedPane

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

我的应用程序是这样构建的: enter image description here

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

因此有一种方法可以禁止主框架中的所有事件,直到ValidDateOrEmptyVerifier返回true

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