Java 文本字段和单选按钮之间的输入验证程序
我将输入验证设置为我的两个文本字段,我希望在验证两个文本字段之前,我的单选按钮应该处于非活动状态 (在文本字段验证之前,用户不能从单选按钮中选择任何。) 在验证JTextFields之前,如何激活JRadioButtons 我的代码:Java 文本字段和单选按钮之间的输入验证程序,java,swing,jtextfield,jradiobutton,inputverifier,Java,Swing,Jtextfield,Jradiobutton,Inputverifier,我将输入验证设置为我的两个文本字段,我希望在验证两个文本字段之前,我的单选按钮应该处于非活动状态 (在文本字段验证之前,用户不能从单选按钮中选择任何。) 在验证JTextFields之前,如何激活JRadioButtons 我的代码: public class AddUserDialog2 extends JDialog implements ActionListener { JButton cancelBtn, okBtn; JTextField fNameTf, lNameTf; JRadi
public class AddUserDialog2 extends JDialog implements ActionListener {
JButton cancelBtn, okBtn;
JTextField fNameTf, lNameTf;
JRadioButton maleRb, femaleRb;
ButtonGroup group;
JLabel fNameLbl, lNameLbl, genderLbl, fNameTemp, lNameTemp, tempBtn, temp3;
public AddUserDialog2() {
add(createForm(), BorderLayout.CENTER);
setDefaultCloseOperation(DISPOSE_ON_CLOSE);
pack();
setVisible(true);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
new AddUserDialog2();
}
});
}
public JPanel createForm() {
JPanel panel = new JPanel();
okBtn = new JButton("Ok");
cancelBtn = new JButton("Cancel");
tempBtn = new JLabel();
fNameLbl = new JLabel("First Name");
fNameTemp = new JLabel();
lNameLbl = new JLabel("Last Name");
lNameTemp = new JLabel();
genderLbl = new JLabel("Gender");
fNameTf = new JTextField(10);
fNameTf.setName("fntf");
fNameTf.setInputVerifier(new MyVerifier());
lNameTf = new JTextField(10);
lNameTf.setName("lntf");
lNameTf.setInputVerifier(new MyVerifier());
maleRb = new JRadioButton("Male");
maleRb.setInputVerifier(new MyVerifier());
femaleRb = new JRadioButton("Female");
femaleRb.setInputVerifier(new MyVerifier());
temp3 = new JLabel();
group = new ButtonGroup();
group.add(maleRb);
group.add(femaleRb);
maleRb.addActionListener(this);
femaleRb.addActionListener(this);
panel.add(fNameLbl);
panel.add(fNameTf);
panel.add(fNameTemp);
panel.add(lNameLbl);
panel.add(lNameTf);
panel.add(lNameTemp);
panel.add(genderLbl);
JPanel radioPanel = new JPanel(new FlowLayout(FlowLayout.LEFT));
radioPanel.add(maleRb);
radioPanel.add(femaleRb);
panel.add(radioPanel);
panel.add(temp3);
panel.add(okBtn);
okBtn.addActionListener(this);
panel.add(cancelBtn);
cancelBtn.addActionListener(this);
panel.add(tempBtn);
panel.setLayout(new SpringLayout());
SpringUtilities.makeCompactGrid(panel, 4, 3, 50, 10, 80, 60);
return panel;
}
@Override
public void actionPerformed(ActionEvent e) {
// Be inactive until two text field verified.
}
public class MyVerifier extends InputVerifier {
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name.equals("fntf")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*")) return false; // Have Digit
} else if (name.equals("lntf")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*")) return false;
}
return true;
}
}
}
更新
我尝试@omainegra解决方案,但出现以下异常:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at Project.AddUserDialog2$MyVerifier.verify(AddUserDialog2.java:107)
at javax.swing.InputVerifier.shouldYieldFocus(InputVerifier.java:132)
at javax.swing.JComponent$1.acceptRequestFocus(JComponent.java:3589)
at java.awt.Component.isRequestFocusAccepted(Component.java:7728)
at java.awt.Component.requestFocusHelper(Component.java:7610)
at java.awt.Component.requestFocusHelper(Component.java:7603)
at java.awt.Component.requestFocus(Component.java:7411)
at javax.swing.JComponent.requestFocus(JComponent.java:1476)
at javax.swing.text.DefaultCaret.adjustFocus(DefaultCaret.java:530)
at javax.swing.text.DefaultCaret.adjustCaretAndFocus(DefaultCaret.java:503)
at javax.swing.text.DefaultCaret.mousePressed(DefaultCaret.java:492)
at java.awt.AWTEventMulticaster.mousePressed(AWTEventMulticaster.java:280)
at java.awt.Component.processMouseEvent(Component.java:6502)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
at java.awt.Component.processEvent(Component.java:6270)
at java.awt.Container.processEvent(Container.java:2229)
at java.awt.Component.dispatchEventImpl(Component.java:4861)
at java.awt.Container.dispatchEventImpl(Container.java:2287)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4832)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4489)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4422)
at java.awt.Container.dispatchEventImpl(Container.java:2273)
at java.awt.Window.dispatchEventImpl(Window.java:2719)
at java.awt.Component.dispatchEvent(Component.java:4687)
at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:723)
at java.awt.EventQueue.access$200(EventQueue.java:103)
at java.awt.EventQueue$3.run(EventQueue.java:682)
at java.awt.EventQueue$3.run(EventQueue.java:680)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:87)
at java.awt.EventQueue$4.run(EventQueue.java:696)
at java.awt.EventQueue$4.run(EventQueue.java:694)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:76)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:693)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:242)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:161)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:150)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:146)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:138)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:91)
从您的代码中,我猜
公共类MyVerifier
是AddUserDialog2
的一个内部类。如果是这样,那么您应该能够在布尔验证(JComponent input)
函数的开头和结尾禁用JRadioButton
。这是我能想到的最简单的解决方案:
public boolean verify(JComponent input) {
maleRb.setEnabled(false);
femaleRb.setEnabled(false);
String name = input.getName();
if (name.equals("fntf")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*")) return false; // Have Digit
} else if (name.equals("lntf")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*")) return false;
}
maleRb.setEnabled(true);
femaleRb.setEnabled(true);
return true;
}
但是这样做,恐怕你不会拦截禁用效果。
在代码中:
fNameTf.setName("fntf");
fNameTf.setInputVerifier(new MyVerifier());
lNameTf = new JTextField(10);
lNameTf.setName("lntf");
lNameTf.setInputVerifier(new MyVerifier());
maleRb = new JRadioButton("Male");
maleRb.setInputVerifier(new MyVerifier());
maleRb.setName("male");
femaleRb = new JRadioButton("Female");
femaleRb.setName("Female");
femaleRb.setInputVerifier(new MyVerifier());
您不需要为公共输入验证创建4个对象。只需创建一个并将其传递给这四个输入对象再次,当您将“male”传递给JRadioButton时,它设置的是文本字段,而不是名称。因此,您需要使用
maleRb.setName(“男性”)
和femaleRb.setName(“女性”)
,错误就会消失。从您的代码中,我猜公共类MyVerifier
是AddUserDialog2
的内部类。如果是这样,那么您应该能够在布尔验证(JComponent input)
函数的开头和结尾禁用JRadioButton
。这是我能想到的最简单的解决方案:
public boolean verify(JComponent input) {
maleRb.setEnabled(false);
femaleRb.setEnabled(false);
String name = input.getName();
if (name.equals("fntf")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*")) return false; // Have Digit
} else if (name.equals("lntf")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*")) return false;
}
maleRb.setEnabled(true);
femaleRb.setEnabled(true);
return true;
}
但是这样做,恐怕你不会拦截禁用效果。
在代码中:
fNameTf.setName("fntf");
fNameTf.setInputVerifier(new MyVerifier());
lNameTf = new JTextField(10);
lNameTf.setName("lntf");
lNameTf.setInputVerifier(new MyVerifier());
maleRb = new JRadioButton("Male");
maleRb.setInputVerifier(new MyVerifier());
maleRb.setName("male");
femaleRb = new JRadioButton("Female");
femaleRb.setName("Female");
femaleRb.setInputVerifier(new MyVerifier());
您不需要为公共输入验证创建4个对象。只需创建一个并将其传递给这四个输入对象再次,当您将“male”传递给JRadioButton时,它设置的是文本字段,而不是名称。因此,您需要使用
maleRb.setName(“male”)
和femaleRb.setName(“male”)
,错误就会消失。我认为更好的方法是使用数据绑定。检查JGoodies绑定,但您可以试试这个
修改类MyVerifier
添加接受和数组JComponent
的构造函数。如果验证为真,则将启用此组件,否则将禁用此组件
public class MyVerifier extends InputVerifier {
JComponent [] components;
public MyVerifier(){
}
public MyVerifier(JComponent [] components){
this.components = components;
}
private void enableComponents(){
//enable dependent components
if (components != null){
for (JComponent r: components){
r.setEnabled(true);
}
}
}
private void disableComponents(){
//disable dependent components
if (components != null){
for (JComponent r: components){
r.setEnabled(false);
}
}
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name == null) {
return false;
}
else if (name.equals("fntf")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*")){
//disable dependent components
disableComponents();
return false; // Have Digit
}
} else if (name.equals("lntf")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*")){
//disable dependent components
disableComponents();
return false;
}
}
enableComponents();
return true;
}
}
然后构造验证器,根据验证结果传递要启用或禁用的组件列表
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb}));
这不仅适用于
JRadioButton
,而且适用于任何JComponent
我认为更好的方法是使用数据绑定。检查JGoodies绑定,但您可以试试这个
修改类MyVerifier
添加接受和数组JComponent
的构造函数。如果验证为真,则将启用此组件,否则将禁用此组件
public class MyVerifier extends InputVerifier {
JComponent [] components;
public MyVerifier(){
}
public MyVerifier(JComponent [] components){
this.components = components;
}
private void enableComponents(){
//enable dependent components
if (components != null){
for (JComponent r: components){
r.setEnabled(true);
}
}
}
private void disableComponents(){
//disable dependent components
if (components != null){
for (JComponent r: components){
r.setEnabled(false);
}
}
}
@Override
public boolean verify(JComponent input) {
String name = input.getName();
if (name == null) {
return false;
}
else if (name.equals("fntf")) {
String text = ((JTextField) input).getText().trim();
if (text.matches(".*\\d.*")){
//disable dependent components
disableComponents();
return false; // Have Digit
}
} else if (name.equals("lntf")) {
String text = ((JTextField) input).getText();
if (text.matches(".*\\d.*")){
//disable dependent components
disableComponents();
return false;
}
}
enableComponents();
return true;
}
}
然后构造验证器,根据验证结果传递要启用或禁用的组件列表
fNameTf.setInputVerifier(new MyVerifier(new JComponent[]{maleRb, femaleRb}));
这不仅适用于
JRadioButton
,也适用于任何JComponent
,但如果要在非活动模式下选择其中一个单选按钮,则会出现java.lang.NullPointerException
。@Sajjad发布堆栈跟踪,以便我们可以看到错误发生的位置和原因cause@Sajjad,我已经更新了答案。使用当前更改进行检查,避免向JRadioButton添加输入验证器。我想没有必要。如果仍然存在异常,请按照@omainegra建议的方式发布stacktrace。@omainegra我发布了它。@Sage我对它们进行了注释,但仍然会出现异常。它可以工作,但如果要在非活动模式下的某个单选按钮中进行选择,java.lang.NullPointerException
发生。@Sajjad发布Stacktrace,以便我们可以看到错误发生的位置以及错误的原因cause@Sajjad,我已经更新了答案。使用当前更改进行检查,避免向JRadioButton添加输入验证器。我想没有必要。如果仍然存在异常,请按照@omainegra的建议发布stacktrace。@omainegra我发布了它。@Sage我对它们进行了评论,但仍然存在异常。@AndrewThompson我的问题是,我该怎么做@AndrewThompson你对将问题编辑成..问题是什么意思?@AndrewThompson我知道如何编辑帖子,你说编辑问题标题或正文?我没有注意到8分钟前添加问题的编辑。这就够了。(至于问题的“标题/正文”。如果我在标题中看到一个问题并正在编辑该问题,我会将其转换为声明,并在正文的第一行重复该问题。这只是个人偏好,而不是SE/SO的“规则或指南”。@AndrewThompson Ok,谢谢。@AndrewThompson我的问题是我该怎么做@AndrewThompson你对将问题编辑成..问题是什么意思?@AndrewThompson我知道如何编辑帖子,你说编辑问题标题或正文?我没有注意到8分钟前添加问题的编辑。这就够了。(至于问题的“标题/正文”。如果我在标题中看到一个问题并正在编辑该问题,我会将其转换为声明,并在正文的第一行重复该问题。这只是个人偏好,而不是SE/SO的“规则或指南”。@AndrewThompson Ok,谢谢。java.lang.NullPointerException
在第一个文本字段中输入数字时发生。现在,异常发生在r.setEnabled(true)代码>行。java.lang.NullPointerException
在第一个文本字段中输入数字时发生。现在,异常发生在r.setEnabled(true)代码>行。