3

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

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

如果输入格式错误并且用户失去了 的焦点JdbDateTextField,我返回false并且ValidDateOrEmptyVerifier再次获得焦点JdbDateTextField

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

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

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

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

我的问题是:

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

4

2 回答 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);
于 2015-12-16T17:35:51.627 回答
0

我希望我可以这样做作为答案:

上述解决方案适用于JTabbedPane

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

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

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

那么有没有办法在ValidDateOrEmptyVerifier返回之前禁止主框架中的所有事件true

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

于 2015-12-17T11:54:52.513 回答