我有一个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
之前执行任何其他事件
答案 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)