在按钮单击上执行JTextField验证会抛出NullPointerException

时间:2014-03-14 17:57:51

标签: java swing validation jtextfield user-input

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

主要概念是让用户在少数文本字段中输入少量数字,当他点击按钮运行某些方法来验证输入时。

  • 检查文本字段中是否只有数字。
  • 检查文本字段中是否有重复的数字。
  • 检查所有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...

2 个答案:

答案 0 :(得分:0)

您可以尝试以下代码:

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();

答案 1 :(得分:0)

在这一行:

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();
            }
        });
    }
}