|
31 | 31 | package org.scijava.ui.swing.widget;
|
32 | 32 |
|
33 | 33 | import java.awt.Adjustable;
|
| 34 | +import java.awt.Component; |
34 | 35 | import java.awt.Dimension;
|
35 | 36 | import java.awt.event.AdjustmentEvent;
|
36 | 37 | import java.awt.event.AdjustmentListener;
|
| 38 | +import java.awt.event.FocusEvent; |
| 39 | +import java.awt.event.FocusListener; |
37 | 40 | import java.math.BigDecimal;
|
38 | 41 | import java.math.BigInteger;
|
39 | 42 | import java.text.DecimalFormat;
|
|
44 | 47 | import javax.swing.JScrollBar;
|
45 | 48 | import javax.swing.JSlider;
|
46 | 49 | import javax.swing.JSpinner;
|
| 50 | +import javax.swing.JTextField; |
47 | 51 | import javax.swing.SpinnerNumberModel;
|
| 52 | +import javax.swing.SwingUtilities; |
48 | 53 | import javax.swing.event.ChangeEvent;
|
49 | 54 | import javax.swing.event.ChangeListener;
|
50 | 55 |
|
@@ -121,6 +126,9 @@ else if (model.isStyle(NumberWidget.SLIDER_STYLE)) {
|
121 | 126 | final SpinnerNumberModel spinnerModel =
|
122 | 127 | new SpinnerNumberModelFactory().createModel(value, min, max, stepSize);
|
123 | 128 | spinner = new JSpinner(spinnerModel);
|
| 129 | + |
| 130 | + fixSpinnerFocus(); |
| 131 | + |
124 | 132 | fixSpinner(type);
|
125 | 133 | setToolTip(spinner);
|
126 | 134 | getComponent().add(spinner);
|
@@ -200,6 +208,43 @@ private void fixSpinner(final Class<?> type) {
|
200 | 208 | }
|
201 | 209 | }
|
202 | 210 |
|
| 211 | + /** |
| 212 | + * Adapted from <a href= |
| 213 | + * "http://stackoverflow.com/questions/20971050/jspinner-autoselect-onfocus" |
| 214 | + * >this SO post</a>. |
| 215 | + * |
| 216 | + * Tries to ensure that the text of a {@link JSpinner} is selected when it |
| 217 | + * has focus. |
| 218 | + */ |
| 219 | + private void fixSpinnerFocus() { |
| 220 | + for (final Component c : spinner.getEditor().getComponents()) { |
| 221 | + if (JTextField.class.isAssignableFrom(c.getClass())) { |
| 222 | + c.addFocusListener(new FocusListener() { |
| 223 | + |
| 224 | + @Override |
| 225 | + public void focusGained(final FocusEvent e) { |
| 226 | + queueSelection(); |
| 227 | + } |
| 228 | + |
| 229 | + @Override |
| 230 | + public void focusLost(final FocusEvent e) { |
| 231 | + queueSelection(); |
| 232 | + } |
| 233 | + |
| 234 | + private void queueSelection() { |
| 235 | + SwingUtilities.invokeLater(new Runnable() { |
| 236 | + @Override |
| 237 | + public void run() { |
| 238 | + ((JTextField) c).selectAll(); |
| 239 | + } |
| 240 | + }); |
| 241 | + } |
| 242 | + |
| 243 | + }); |
| 244 | + } |
| 245 | + } |
| 246 | + } |
| 247 | + |
203 | 248 | /** Sets slider values to match the spinner. */
|
204 | 249 | private void syncSliders() {
|
205 | 250 | if (slider != null) {
|
|
0 commit comments