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 ;
48
52
import javax .swing .event .ChangeEvent ;
49
53
import javax .swing .event .ChangeListener ;
50
54
55
+ import org .scijava .plugin .Parameter ;
51
56
import org .scijava .plugin .Plugin ;
57
+ import org .scijava .thread .ThreadService ;
52
58
import org .scijava .util .NumberUtils ;
53
59
import org .scijava .widget .InputWidget ;
54
60
import org .scijava .widget .NumberWidget ;
@@ -64,6 +70,9 @@ public class SwingNumberWidget extends SwingInputWidget<Number> implements
64
70
NumberWidget <JPanel >, AdjustmentListener , ChangeListener
65
71
{
66
72
73
+ @ Parameter
74
+ private ThreadService threadService ;
75
+
67
76
private JScrollBar scrollBar ;
68
77
private JSlider slider ;
69
78
private JSpinner spinner ;
@@ -121,6 +130,9 @@ else if (model.isStyle(NumberWidget.SLIDER_STYLE)) {
121
130
final SpinnerNumberModel spinnerModel =
122
131
new SpinnerNumberModelFactory ().createModel (value , min , max , stepSize );
123
132
spinner = new JSpinner (spinnerModel );
133
+
134
+ fixSpinnerFocus ();
135
+
124
136
fixSpinner (type );
125
137
setToolTip (spinner );
126
138
getComponent ().add (spinner );
@@ -200,6 +212,43 @@ private void fixSpinner(final Class<?> type) {
200
212
}
201
213
}
202
214
215
+ /**
216
+ * Adapted from <a href=
217
+ * "http://stackoverflow.com/q/20971050/1027800"
218
+ * >this SO post</a>.
219
+ *
220
+ * Tries to ensure that the text of a {@link JSpinner} is selected when it
221
+ * has focus.
222
+ */
223
+ private void fixSpinnerFocus () {
224
+ for (final Component c : spinner .getEditor ().getComponents ()) {
225
+ if (JTextField .class .isAssignableFrom (c .getClass ())) {
226
+ c .addFocusListener (new FocusListener () {
227
+
228
+ @ Override
229
+ public void focusGained (final FocusEvent e ) {
230
+ queueSelection ();
231
+ }
232
+
233
+ @ Override
234
+ public void focusLost (final FocusEvent e ) {
235
+ queueSelection ();
236
+ }
237
+
238
+ private void queueSelection () {
239
+ threadService .queue (new Runnable () {
240
+ @ Override
241
+ public void run () {
242
+ ((JTextField ) c ).selectAll ();
243
+ }
244
+ });
245
+ }
246
+
247
+ });
248
+ }
249
+ }
250
+ }
251
+
203
252
/** Sets slider values to match the spinner. */
204
253
private void syncSliders () {
205
254
if (slider != null ) {
0 commit comments