views:

76

answers:

1

There is apparently a bug introduced in the latest Java update for Mac OS X, which causes deletes in JFormattedTextFields to be performed twice. See http://lists.apple.com/archives/java-dev/2010/May/msg00092.html

The DefaultEditorKit.deletePrevCharAction is invoked twice when the delete key is pressed.

Are there any suggestions for a workaround?

I'm thinking of replacing the delete action for my text fields with a patched version that somehow filters out these duplicate invocations.

+2  A: 

My workaround, that seems to be working quite well:

public class PatchedTextField extends JFormattedTextField {

    public PatchedTextField() {
        super();

        final Action originalDeleteAction =
            getActionMap().get(DefaultEditorKit.deletePrevCharAction);

        getActionMap().put(DefaultEditorKit.deletePrevCharAction,
            new AbstractAction() {
                ActionEvent previousEvent;

                public void actionPerformed(ActionEvent e) {
                // Filter out events that happen within 1 millisecond from each other
                if (previousEvent == null || e.getWhen() - previousEvent.getWhen() > 1) {
                    originalDeleteAction.actionPerformed(e);
                }
                previousEvent = e;
            }
        });
    }
}

The only downside that I have found so far is that you cannot delete more than one character per millisecond.

Johan Kaving
I guess a check for OS and Java version would be appropriate, to avoid adding this where it is not needed.
Johan Kaving