[英]Java Swing JTextField setInputVerifier keep focus on TextField
我有一个public class JdbDateTextField extends JTextField
并在构造函数中添加this.setInputVerifier(new ValidDateOrEmptyVerifier());
。
我使用class ValidDateOrEmptyVerifier extends InputVerifier
来验证输入的格式。
如果输入错误的格式和用户失去了关注的焦点JdbDateTextField
,我返回false
的ValidDateOrEmptyVerifier
和焦点再次上涨到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);
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.