单击时在 JSpinner 中选择部分文本

Selecting a part of text in JSpinner on click

我有一个带有 SpinnerDateModel 的 JSpinner。我希望当用户点击编辑器的任何部分(日期、月份或年份)时,它会自动 select 他们。所以我写了这个:

JSpinner dateSpn = new JSpinner();
dateSpn.setModel(new SpinnerDateModel());
JSpinner.DateEditor editor = new JSpinner.DateEditor(dateSpn, "dd-MM-yyyy");
dateSpn.setEditor(editor);
JFormattedTextField field = editor.getTextField();
field.addMouseListener(new MouseAdapter() {
    public void mousePressed(MouseEvent evt) {
        int i = field.getCaretPosition();
        if (i <= 2) {
            field.select(0, 2);
        } else if (i >= 3 && i <= 5) {
            field.select(3, 5);
        } else if (i >= 6){
            field.select(6, 10);
        }
    }
});

但是第一次点击的时候,没有任何反应。虽然当我再次单击它时,它可以完美运行。我的代码哪里出了问题?

来自 MouseAdapter#mousePressed() 的文档:

Invoked when a mouse button has been pressed on a component.

这意味着仅在按下鼠标时执行此操作(请注意尚未松开)。所以这是第一个被调用的点击/按下/释放方法。

您现在遇到的问题是,此时调用 mousePressed 时,您的 JFormattedTextField 插入符号位置可能尚未正确更新。因此,您遇到的问题。

解决方案是切换到 mouseClicked()(或 mouseReleased() 作为替代),因为到那时,您可以确定您的 JFormattedTextField 已正确更新并且调用的方法获得正确的值。