我有一个微妙的问题!
我有一个表单,用于将输入验证程序设置为文本字段,当用户键入不正确的值时,应禁用其他文本字段和单选按钮。
在第二个文本字段(姓氏)中,当用户键入不正确的值时,其他组件将完全禁用,但当用户编辑该值以进行更正时(例如,删除数字),用户应使用键盘{{1} }按钮启用其他组件(单选按钮),我想通过单击单选按钮启用。
这是我的代码:
tab
答案 0 :(得分:0)
InputVerifier
类的目的是帮助客户通过带有文本字段的GUI支持平滑的焦点导航。在将焦点转移到请求它的另一个Swing组件之前,将调用输入验证程序的shouldYieldFocus
方法(要求verify
函数验证数据)。仅当该方法返回true
时才会转移焦点。
请尝试解决有关使用your previous post中提到的InutVerifier
,verify
和shouldYieldFunction
的问题。如果你不打算改变你的习惯,你将来会有危险。从验证功能中删除启用和禁用代码的组件。
你的问题在这篇文章中:在这种情况下,真正发生的是,当你的数据无效并且你试图通过点击另一个组件来丢失输入文本字段焦点时,{{1被禁用。在重新启用之前,禁用无法关注。当输入验证程序响应焦点丢失事件时,单击JRadioButtons
不会导致焦点导航,因此不会调用disabled RadioButton
来重新启用组件。
按下选项卡,因为它根据swing的焦点遍历策略将Focus发送到第二个文本输入字段。因此,焦点丢失事件发生在第一个输入文本字段上,此时ShouldYieldFocus(which calls verify)
的验证函数被调用,最终启用您的组件。要更好地了解问题,请尝试使用一个InputVerifier
和一个JRadioButton
重写您自己的示例。
尝试将DocumentListener
与您的文字字段一起使用。在数据插入和删除事件时,使用JTextFeild
检查数据有效性,然后启用/禁用相关组件。
我正在编写示例代码段以演示如何将InputVerifier
添加到DocumentListener
和fNameTF
文本字段中以解决您的问题:
lNameTF
fNameTF.getDocument().addDocumentListener(new DocumentListener() {
@Override
public void insertUpdate(DocumentEvent e) {
doOnDataValidity(verifier.verify(fNameTF));
}
@Override
public void removeUpdate(DocumentEvent e) {
doOnDataValidity(verifier.verify(fNameTF));
}
@Override
public void changedUpdate(DocumentEvent e) {}
});
功能如下:
doOnValidity(boolean isValid)
以同样的方式向您的public void doOnDataValidity(boolean isDataValid)
{
if(isDataValid)
{
//enable your components
}else
{
//disable your components
}
}
添加DocumentListener。
教程资源: How to use DocumentListener。