CombinationFormatter.java Source code

Java tutorial

Introduction

Here is the source code for CombinationFormatter.java

Source

/*
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);
    }
}