【问题标题】:Performing JTextField validation on button click throws NullPointerException对按钮单击执行 JTextField 验证会引发 NullPointerException
【发布时间】:2014-04-20 04:25:28
【问题描述】:

我想在按钮单击时验证几个文本字段。

主要概念是让用户在几个文本字段中输入几个数字,并在他单击按钮时运行一些方法来验证输入。

  • 检查文本字段中是否只有数字。
  • 检查文本字段中是否有重复的数字。
  • 检查所有 6 个字段是否包含某个值。
  • 检查数字是否在 1-100 范围内

我想在按钮点击时运行验证

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

} 

这些是我要验证的文本字段:

private javax.swing.JTextField jTextField1;
private javax.swing.JTextField jTextField2;
private javax.swing.JTextField jTextField3;
private javax.swing.JTextField jTextField4;
private javax.swing.JTextField jTextField5;
private javax.swing.JTextField jTextField6;  

我在网上找到了一些代码,但我似乎无法让它工作。 代码如下:

JTextField[] fields;

void validation() { //call when appropriate(ie ActionListener of JButton)     
    System.out.println( "Called validation!");
    int[] nums = new int[fields.length];
    Set<Integer> set = new HashSet<>();
    System.out.println( "Called validation!" + nums);

    for (int i = 0; i < fields.length; i++) {            
        try {
            nums[i] = Integer.parseInt(fields[i].getText());
        } catch (NumberFormatException ex) {
            //not a valid number tell user of error
            JOptionPane.showMessageDialog(null,"Not a valid format");
            return;
        }

        if (nums[i] < 1 || nums[i] > 48) {
            //out of number range tell user of error
            JOptionPane.showMessageDialog(null,"Range error");
            return;
        }

        if (!set.add(nums[i])) {
            //duplicate element tell user of error
            JOptionPane.showMessageDialog(null,"Duplicate");
            return;
        }
    }

    JOptionPane.showMessageDialog(null,"A, OK");
}

我怎样才能使这种方法在按钮点击时起作用。 当我运行此方法时,netbeans 显示错误:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException...

【问题讨论】:

  • 你从未初始化你的JTextField[]。除此之外,还有很多问题。你应该只保留数组,而不是一堆单独的变量——这是不必要的。您是否考虑过使用InputVerifier

标签: java swing validation jtextfield user-input


【解决方案1】:

你可以试试这个代码:

try{
    int nums[] = new int[6];
    nums[0] = Integer.parseInt(jTextField1.getText());
    nums[1] = Integer.parseInt(jTextField2.getText());
    nums[2] = Integer.parseInt(jTextField3.getText());
    nums[3] = Integer.parseInt(jTextField4.getText());
    nums[4] = Integer.parseInt(jTextField5.getText());
    nums[5] = Integer.parseInt(jTextField6.getText());
} catch (NumberFormatException e){
    System.out.println("Some field does not contain a number");
    return;
}

for(int i=0; i<5; i++){
    if(nums[i]==nums[i+1]){
        System.out.println("Repeated number");
        return;
    }
}

对于浮点数:Float.parseFloat();

【讨论】:

  • 我已经尝试过这段代码,但它不起作用:/ 实际上,如果你能帮助我处理我发布的一段代码并告诉我问题可能出在哪里。
  • 有些对象你还没有实例化,所以当你试图调用它的一些方法时,你会得到这个NullPointerException。如果您发布整个错误消息(带有行号)和相关代码,我可能会提供帮助。 PS:看起来这个对象很可能是字段之一或字段数组本身(我没有看到您在哪里实例化数组,也许您已经忘记了)。
【解决方案2】:

在这一行:

int[] nums = new int[fields.length];

根据您的代码,fields 似乎从未初始化,因此您获得了 NPE。

一些提示

这些要求:

  • 检查文本字段中是否只有数字。
  • 检查所有 6 个字段是否包含某个值。
  • 检查数字是否在 1-100 范围内

可以通过使用格式化文本字段或微调器而不是纯文本字段轻松完成。通过使用其中之一,您不必关心解析字符串,因为您可以使用户的输入限制为整数。您还可以给它们一个默认值,以便它们都有一个值。最后,您可以设置允许的值范围。

查看How to Use Formatted Text FieldsHow to Use Spinners 教程。

其他要求:

  • 检查文本字段中是否有重复的数字。

可以通过遍历格式化的文本字段或微调器、请求它们的值并验证这些条件来完成。

示例

此示例基于格式化的文本字段,但也可以使用微调器来完成。

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Component;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.text.NumberFormat;
import java.util.ArrayList;
import java.util.List;
import javax.swing.JButton;
import javax.swing.JFormattedTextField;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;
import javax.swing.text.NumberFormatter;

public class Demo {

    private void createAndShowGUI() {

        NumberFormat  format = NumberFormat.getInstance();
        format.setParseIntegerOnly(true);

        NumberFormatter formatter = new NumberFormatter(format);
        formatter.setMinimum(1);
        formatter.setMaximum(100);
        formatter.setAllowsInvalid(false);
        formatter.setOverwriteMode(true);        

        final JPanel gridPanel = new JPanel(new GridLayout(2, 3));

        for (int i = 0; i < 6; i++) {
            JFormattedTextField textField = new JFormattedTextField(formatter);
            textField.setColumns(5);
            textField.setValue(1);
            gridPanel.add(textField);
        }

        JButton button = new JButton("Validate");
        button.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                List list = new ArrayList();
                for(Component comp : gridPanel.getComponents()) {
                    JFormattedTextField textField = (JFormattedTextField)comp;
                    Integer value = (Integer)textField.getValue();
                    Color foreground = list.contains(value) ? Color.RED : Color.BLACK;
                    textField.setForeground(foreground);
                    list.add(value);
                }
            }
        });

        JFrame frame = new JFrame("Demo");
        frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
        frame.add(gridPanel, BorderLayout.CENTER);
        frame.add(button, BorderLayout.SOUTH);
        frame.pack();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {                
                new Demo().createAndShowGUI();
            }
        });
    }
}

【讨论】:

    猜你喜欢
    • 2018-04-04
    • 1970-01-01
    • 2017-06-06
    • 2020-10-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-12-20
    相关资源
    最近更新 更多