我有几个带有 SpinnerNumberModel 的 JSpinner。每当我单击尚未获得焦点的 JSpinner 时,它都会聚焦 JSpinner,但插入符号将始终设置在数字的最左侧位置。
我需要稍等片刻,然后再次单击才能将插入符号设置在我想要设置的位置。如果我点击太快,它会选择整个数字。
我需要做什么才能使插入符号在第一次单击时定位在鼠标位置,即使 JSpinner 没有焦点?
要实现此目的,您需要添加一个 MouseListener,它将鼠标位置转换为插入符号位置并设置插入符号,如本问题中所述:https://stackoverflow.com/a/2202041/406423
public class GUITestJSpinner extends JPanel {
private JSpinner integerSpinner;
private JSpinner doubleSpinner;
private JSpinner dateSpinner;
...
public GUITestJSpinner() {
...
integerSpinner.setModel(new SpinnerNumberModel(100, null, null, 10));
addEditorMouseListener(integerSpinner);
doubleSpinner.setModel(new SpinnerNumberModel(100.23, null, null, 10.0));
addEditorMouseListener(doubleSpinner);
dateSpinner.setModel(new SpinnerDateModel(Calendar.getInstance().getTime(), null, null, Calendar.DAY_OF_YEAR));
addEditorMouseListener(dateSpinner);
}
private static void addEditorMouseListener(JSpinner jspinner) {
JSpinner.DefaultEditor editor = (JSpinner.DefaultEditor) jspinner.getEditor();
editor.getTextField().addMouseListener(
new MouseAdapter() {
public void mousePressed(final MouseEvent e) {
SwingUtilities.invokeLater(new Runnable() {
@Override
public void run() {
JTextField tf = (JTextField) e.getSource();
int offset = tf.viewToModel(e.getPoint());
tf.setCaretPosition(offset);
}
});
}
}
);
}
请注意,将模型设置为新模型将重置该行为。您需要再次添加 MouseListener 或就地更改模型的值,如下所示:
...
SpinnerNumberModel snm = (SpinnerNumberModel) doubleSpinner.getModel();
snm.setValue(220.34);
snm.setStepSize(20.0);
...
另请注意,即使这与使用 SpinnerDateModel 的 JSpinner 一起按预期工作,但在单击向上和向下箭头时,它的行为仍然非常“奇怪”。我建议不要使用 JSpinner 选择日期,并建议使用 SwingX 中的 JXDatePicker。
最后注意:双击选择 JSpinner 的内容不再起作用。您需要三次单击才能选择 JSpinner 的内容。