FlatLaf
FlatLaf copied to clipboard
Mouse wheel support for JSpinners
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);
}
}
}
}
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.
If it can be configured globally or per component that's even better.