Mega Code Archive

 
Categories / Java / Swing JFC
 

A formatter for regular expressions to be used with JFormattedTextField

/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly  */ // RegexPatternFormatter.java //A formatter for regular expressions to be used with JFormattedTextField. // import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.DefaultFormatter; public class RegexPatternFormatter extends DefaultFormatter {   protected java.util.regex.Matcher matcher;   public RegexPatternFormatter(java.util.regex.Pattern regex) {     setOverwriteMode(false);     matcher = regex.matcher(""); // create a Matcher for the regular                    // expression   }   public Object stringToValue(String string) throws java.text.ParseException {     if (string == null)       return null;     matcher.reset(string); // set 'string' as the matcher's input     if (!matcher.matches()) // Does 'string' match the regular expression?       throw new java.text.ParseException("does not match regex", 0);     // If we get this far, then it did match.     return super.stringToValue(string); // will honor the 'valueClass'                       // property   }   public static void main(String argv[]) {     // a demo main() to show how RegexPatternFormatter could be used     JLabel lab1 = new JLabel("even length strings:");     java.util.regex.Pattern evenLength = java.util.regex.Pattern         .compile("(..)*");     JFormattedTextField ftf1 = new JFormattedTextField(         new RegexPatternFormatter(evenLength));     JLabel lab2 = new JLabel("no vowels:");     java.util.regex.Pattern noVowels = java.util.regex.Pattern.compile(         "[^aeiou]*", java.util.regex.Pattern.CASE_INSENSITIVE);     RegexPatternFormatter noVowelFormatter = new RegexPatternFormatter(         noVowels);     noVowelFormatter.setAllowsInvalid(false); // don't allow user to type                           // vowels     JFormattedTextField ftf2 = new JFormattedTextField(noVowelFormatter);     JFrame f = new JFrame("RegexPatternFormatter Demo");     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);     JPanel pan1 = new JPanel(new java.awt.BorderLayout());     pan1.add(lab1, java.awt.BorderLayout.WEST);     pan1.add(ftf1, java.awt.BorderLayout.CENTER);     lab1.setLabelFor(ftf1);     f.getContentPane().add(pan1, java.awt.BorderLayout.NORTH);     JPanel pan2 = new JPanel(new java.awt.BorderLayout());     pan2.add(lab2, java.awt.BorderLayout.WEST);     pan2.add(ftf2, java.awt.BorderLayout.CENTER);     lab2.setLabelFor(ftf2);     f.getContentPane().add(pan2, java.awt.BorderLayout.SOUTH);     f.setSize(300, 80);     f.setVisible(true);   } }