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

问题描述

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

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.

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

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

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