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
的焦点,我 return false
在 ValidDateOrEmptyVerifier
中获得了焦点又到JdbDateTextField
了。
如果用户从 JdbDateTextField
切换到另一个文本字段或按下按钮,这将起作用。如果按下按钮并且输入的格式错误,则不会执行该按钮的任何操作并且焦点仍位于 JdbDateTextField
.
这正是我想要的。在输入有效字符串之前,用户不能离开 JdbDateTextField
。
问题是 JdbDateTextField
在 JPanel 中,而 JPanel 在 JTabbedPane
中,所以我有一个带有多个选项卡的 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
但我仍然可以 select 其他 GUI 元素。
我的应用程序是这样构建的:
对于每个 Person ID
,我在 JTabbedPane
中显示其他 Birthdate
个值
我仍然可以切换到另一个 Person ID
如果 ValidDateOrEmptyVerifier
returns false
.
那么有没有办法禁止主框架中的所有事件,直到 ValidDateOrEmptyVerifier
returns true
.
所以基本上我想要的是用户只有在输入有效日期或字段为空时才能退出 "Birthdate" JdbDateTextField
。
我有一个 public class JdbDateTextField extends JTextField
,在构造函数中我添加了 this.setInputVerifier(new ValidDateOrEmptyVerifier());
。
我使用class ValidDateOrEmptyVerifier extends InputVerifier
来验证输入的格式。
如果输入格式错误,用户失去了 JdbDateTextField
的焦点,我 return false
在 ValidDateOrEmptyVerifier
中获得了焦点又到JdbDateTextField
了。
如果用户从 JdbDateTextField
切换到另一个文本字段或按下按钮,这将起作用。如果按下按钮并且输入的格式错误,则不会执行该按钮的任何操作并且焦点仍位于 JdbDateTextField
.
这正是我想要的。在输入有效字符串之前,用户不能离开 JdbDateTextField
。
问题是 JdbDateTextField
在 JPanel 中,而 JPanel 在 JTabbedPane
中,所以我有一个带有多个选项卡的 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
但我仍然可以 select 其他 GUI 元素。
我的应用程序是这样构建的:
对于每个 Person ID
,我在 JTabbedPane
中显示其他 Birthdate
个值
我仍然可以切换到另一个 Person ID
如果 ValidDateOrEmptyVerifier
returns false
.
那么有没有办法禁止主框架中的所有事件,直到 ValidDateOrEmptyVerifier
returns true
.
所以基本上我想要的是用户只有在输入有效日期或字段为空时才能退出 "Birthdate" JdbDateTextField
。