package tim.prune.gui; import javax.swing.JTextField; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.text.AttributeSet; import javax.swing.text.BadLocationException; import javax.swing.text.PlainDocument; /** * text field for holding a single integer with validation */ public class WholeNumberField extends JTextField { /** * Inner class to act as document for validation */ protected static class WholeNumberDocument extends PlainDocument { /** Num digits to allow */ private int _maxDigits = 0; /** * Constructor * @param inMaxDigits max digits to allow */ public WholeNumberDocument(int inMaxDigits) { _maxDigits = inMaxDigits; } /** * Override the insert string method * @param offs offset * @param str string * @param a attributes * @throws BadLocationException on insert failure */ public void insertString(int offs, String str, AttributeSet a) throws BadLocationException { if (getLength() >= _maxDigits) return; char[] source = str.toCharArray(); char[] result = new char[source.length]; int j = 0; for (int i = 0; i < result.length && j < _maxDigits; i++) { if (Character.isDigit(source[i])) result[j++] = source[i]; } super.insertString(offs, new String(result, 0, j), a); } } /** * Constructor * @param inMaxDigits max digits to allow */ public WholeNumberField(int inMaxDigits) { super(inMaxDigits); setDocument(new WholeNumberDocument(inMaxDigits)); getDocument().addDocumentListener(new DocumentListener() { public void removeUpdate(DocumentEvent arg0) {fireActionPerformed();} public void insertUpdate(DocumentEvent arg0) {fireActionPerformed();} public void changedUpdate(DocumentEvent arg0) {fireActionPerformed();} }); } /** * @return integer value */ public int getValue() { return parseValue(getText()); } /** * @param inValue value to set */ public void setValue(int inValue) { setText("" + inValue); } /** * @param inText text to parse * @return value as integer */ private static int parseValue(String inText) { int value = 0; try { value = Integer.parseInt(inText); } catch (NumberFormatException nfe) {} if (value < 0) { value = 0; } return value; } }