FlatLaf icon indicating copy to clipboard operation
FlatLaf copied to clipboard

Mouse wheel support for JSpinners

Open ebourg opened this issue 4 years ago • 2 comments

I'd like to suggest an improvement to JSpinners, in addition to the up/down buttons the value could be modified with the mouse wheel. Here is how I've implemented it in a custom look and feel:

public class MyFlatSpinnerUI extends FlatSpinnerUI {

    private MouseWheelListener mouseWheelListener = event -> {
        Object value = event.getUnitsToScroll() < 0 ? spinner.getNextValue() : spinner.getPreviousValue();
        if (value != null) {
            spinner.setValue(value);
        }
    };

    public static ComponentUI createUI(JComponent c) {
        return new MyFlatSpinnerUI();
    }

    @Override
    protected void installListeners() {
        super.installListeners();
        installMouseWheelListener();
    }

    protected void installMouseWheelListener() {
        JComponent editor = spinner.getEditor();
        if (editor instanceof JSpinner.DefaultEditor) {
            JTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
            if (tf != null) {
                tf.addMouseWheelListener(mouseWheelListener);
            }
        }
    }

    @Override
    protected void replaceEditor(JComponent oldEditor, JComponent newEditor) {
        super.replaceEditor(oldEditor, newEditor);
        installMouseWheelListener();
    }

    @Override
    protected void uninstallListeners() {
        super.uninstallListeners();
        JComponent editor = spinner.getEditor();
        if (editor instanceof JSpinner.DefaultEditor) {
            JTextField tf = ((JSpinner.DefaultEditor) editor).getTextField();
            if (tf != null) {
                tf.removeMouseWheelListener(mouseWheelListener);
            }
        }
    }
}

ebourg avatar Nov 25 '21 22:11 ebourg

As long as this functionality can be turned off, or isn't on by default. Having values change in a destructive manner by accident when using a mouse wheel (combo boxes are very prone to this) is very annoying behaviour.

gtimbo avatar Nov 26 '21 07:11 gtimbo

If it can be configured globally or per component that's even better.

ebourg avatar Nov 29 '21 15:11 ebourg