Java tutorial
/* Java Swing, 2nd Edition By Marc Loy, Robert Eckstein, Dave Wood, James Elliott, Brian Cole ISBN: 0-596-00408-7 Publisher: O'Reilly */ // CombinationFormatter.java //Input: string of form "15-45-22" (any number of hyphen-delimeted numbers) //<br>Output: int array // import javax.swing.AbstractAction; import javax.swing.Action; import javax.swing.JButton; import javax.swing.JFormattedTextField; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JPanel; import javax.swing.text.DefaultFormatter; public class CombinationFormatter extends DefaultFormatter { public CombinationFormatter() { setOverwriteMode(false); } public Object stringToValue(String string) throws java.text.ParseException { // input: string of form "15-45-22" (any number of hyphen-delimeted // numbers) // output: int array String s[] = string.split("-"); int a[] = new int[s.length]; for (int j = 0; j < a.length; j += 1) try { a[j] = Integer.parseInt(s[j]); } catch (NumberFormatException nfe) { throw new java.text.ParseException(s[j] + " is not an int", 0); } return a; } public String valueToString(Object value) throws java.text.ParseException { // input: int array // output: string of numerals separated by hyphens if (value == null) return null; if (!(value instanceof int[])) throw new java.text.ParseException("expected int[]", 0); int a[] = (int[]) value; StringBuffer sb = new StringBuffer(); for (int j = 0; j < a.length; j += 1) { if (j > 0) sb.append('-'); sb.append(a[j]); } return sb.toString(); } protected Action[] getActions() { Action[] actions = { new CombinationIncrementer("increment", 1), new CombinationIncrementer("decrement", -1) }; return actions; } // begin inner class ---------------------------------------- public class CombinationIncrementer extends AbstractAction { protected int delta; public CombinationIncrementer(String name, int delta) { // constructor super(name); // 'name' must match something in the component's // InputMap // or else this Action will not get invoked automatically. // Valid names include: "reset-field-edit", "increment", // "decrement", and "unselect" (see appendix B) this.delta = delta; } public void actionPerformed(java.awt.event.ActionEvent ae) { JFormattedTextField ftf = getFormattedTextField(); // from // AbstractFormtter if (ftf == null) return; String text = ftf.getText(); if (text == null) return; int pos = ftf.getCaretPosition(); int hyphenCount = 0; for (int j = 0; j < pos; j += 1) // how many hyphens precede the caret? if (text.charAt(j) == '-') hyphenCount += 1; try { int a[] = (int[]) stringToValue(text); a[hyphenCount] += delta; // change the number at caret position if (a[hyphenCount] < 0) a[hyphenCount] = 0; String newText = valueToString(a); ftf.setText(newText); // does not retain caret position if ((text.charAt(pos) == '-') && (newText.length() < text.length())) pos -= 1; // don't let caret move past '-' when '10' changes // to '9' ftf.setCaretPosition(pos); } catch (Exception e) { return; } } } // end inner class ---------------------------------------- public static void main(String argv[]) { // a demo main() to show how CombinationFormatter could be used int comb1[] = { 35, 11, 19 }; int comb2[] = { 10, 20, 30 }; final JFormattedTextField field1 = new JFormattedTextField(new CombinationFormatter()); field1.setValue(comb1); final JFormattedTextField field2 = new JFormattedTextField(new CombinationFormatter()); field2.setValue(comb2); JPanel pan = new JPanel(); pan.add(new JLabel("Change the combination from")); pan.add(field1); pan.add(new JLabel("to")); pan.add(field2); JButton b = new JButton("Submit"); b.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent ae) { try { field1.commitEdit(); // make sure current edit (if any) gets // committed field2.commitEdit(); } catch (java.text.ParseException pe) { } int oldc[] = (int[]) field1.getValue(); int newc[] = (int[]) field2.getValue(); // // code to validate oldc[] and change to newc[] goes here // } }); pan.add(b); JFrame f = new JFrame("CombinationFormatter Demo"); f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); f.setContentPane(pan); f.setSize(360, 100); f.setVisible(true); } }