使用JOptionPane进行数据验证

时间:2014-08-21 04:28:54

标签: java swing joptionpane validation

我想在JOptionPane.I找到以下方法时执行数据验证,但我对此并不满意

import javax.swing.*;
import java.util.regex.*;

public class ValidateJOptionPane {
        public static void main(String[] args) {
        String input = JOptionPane.showInputDialog("Enter number: ");
                Pattern p = Pattern.compile("[A-Z,a-z,&%$#@!()*^]");
                Matcher m = p.matcher(input);
                if (m.find()) {
             JOptionPane.showMessageDialog(null, "Please enter only numbers");
                }
        }
}

使用正则表达式检测可输入的字符而不是测试无法输入的字符会更好,更明智。

使用JOptionPane进行数据验证是否有更好更简单的方法? 。我觉得正则表达式在这里有点矫枉过正。如果我错了,请更正我:P

P.S我是Java的初学者

2 个答案:

答案 0 :(得分:4)

答案很长,请使用DocumentFilter,有关详细信息,请参阅Implementing a Document FilterDocumentFilter Examples

问题在于,你需要控制,你不能依赖"简单","帮助"由JOptionPane.showInputDialog提供的功能,因为您需要访问用于提示用户的文本字段...

例如......

Filter input

以下示例使用来自DocumentFilter Examples

PatternFilter的(略微)修改版本
import java.util.regex.Matcher;
import java.util.regex.Pattern;
import javax.swing.JComponent;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JTextField;
import javax.swing.text.AbstractDocument;
import javax.swing.text.AttributeSet;
import javax.swing.text.BadLocationException;
import javax.swing.text.DocumentFilter;
import javax.swing.text.DocumentFilter.FilterBypass;

public class ValidateTest {

    public static void main(String[] args) {
        JTextField field = new JTextField(20);
        Pattern p = Pattern.compile("[0-9]+");
        ((AbstractDocument) field.getDocument()).setDocumentFilter(new PatternFilter(p));
        int option = ask("Enter number:", field);
        if (option == JOptionPane.OK_OPTION) {
            System.out.println("You have entered " + field.getText());
        }
    }

    public static int ask(String label, JComponent comp) {

        JPanel panel = new JPanel();
        panel.add(new JLabel(label));
        panel.add(comp);

        return JOptionPane.showOptionDialog(null, panel, label, 
                        JOptionPane.OK_CANCEL_OPTION, 
                        JOptionPane.QUESTION_MESSAGE, null, null, null);

    }

    public static class PatternFilter extends DocumentFilter {

        // Useful for every kind of input validation !
        // this is the insert pattern
        // The pattern must contain all subpatterns so we can enter characters into a text component !
        private Pattern pattern;

        public PatternFilter(Pattern p) {
            pattern = p;
        }

        public void insertString(FilterBypass fb, int offset, String string, AttributeSet attr)
                        throws BadLocationException {

            String newStr = fb.getDocument().getText(0, fb.getDocument().getLength()) + string;
            Matcher m = pattern.matcher(newStr);
            if (m.matches()) {
                super.insertString(fb, offset, string, attr);
            } else {
            }
        }

        public void replace(FilterBypass fb, int offset,
                        int length, String string, AttributeSet attr) throws
                        BadLocationException {

            if (length > 0) {
                fb.remove(offset, length);
            }
            insertString(fb, offset, string, attr);
        }
    }

}

现在,通过一个聪明的设计,您可以编写一个简单的帮助器类,在内部构建所有这些,并提供一个很好的askFor(String label, Pattern p)样式方法,可以返回String(或null如果用户取消了操作)

答案 1 :(得分:1)

正如你所说"使用正则表达式检测可以输入的字符而不是测试无法输入的字符会更好更明智。&#34 ; 所以你可以进行反向检查:

import javax.swing.*;
import java.util.regex.*;

public class ValidateJOptionPane {

  public static void main(String[] args) {
    String input = JOptionPane.showInputDialog("Enter number: ");
            Pattern p = Pattern.compile("^[0-9]*$");
            Matcher m = p.matcher(input);
            if (!m.find()) { // if pattern doesn't match (not found) 
             JOptionPane.showMessageDialog(null, "Please enter only numbers");
            }
    }
  }

[0-9]表示数字0-9,而*表示一些空格