设置鼠标单击的插入符位置

问题描述 投票:0回答:1

我有几个带有 SpinnerNumberModel 的 JSpinner。每当我单击尚未获得焦点的 JSpinner 时,它都会聚焦 JSpinner,但插入符号将始终设置在数字的最左侧位置。

我需要稍等片刻,然后再次单击才能将插入符号设置在我想要设置的位置。如果我点击太快,它会选择整个数字。

我需要做什么才能使插入符号在第一次单击时定位在鼠标位置,即使 JSpinner 没有焦点?

java caret jspinner
1个回答
0
投票

要实现此目的,您需要添加一个 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 的内容。

© www.soinside.com 2019 - 2024. All rights reserved.