Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/72.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 文本字段和单选按钮之间的输入验证程序_Java_Swing_Jtextfield_Jradiobutton_Inputverifier - Fatal编程技术网

Java 文本字段和单选按钮之间的输入验证程序

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

我将输入验证设置为我的两个文本字段,我希望在验证两个文本字段之前,我的单选按钮应该处于非活动状态

(在文本字段验证之前,用户不能从单选按钮中选择任何。)

在验证JTextFields之前,如何激活JRadioButtons

我的代码:

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)行。