问题描述
我有一个带有 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
已正确更新并且调用的方法得到正确的值。