所以我使用JSpinner.DateEditor创建了一个微调器,并且稍微更改了格式化程序以验证用户输入。
JSpinner sp1 = new JSpinner(sm);
JSpinner.DateEditor de = new JSpinner.DateEditor(sp1, "hh:mm:ss a");
JFormattedTextField ftf = de.getTextField();
DateFormatter formatter = (DateFormatter) ftf.getFormatter();
formatter.setAllowsInvalid(false);
formatter.setOverwriteMode(true);
sp1.setEditor(de);
除了一件事之外它工作得很好。例如,时间是 上午11:32:12
如果我将光标放在32到12之间的冒号之前。我得到了 上午11:02:12
但我想得到 上午11:30:12
对此有何帮助? 感谢
答案 0 :(得分:1)
根据这个问题的标题和描述的行为,在这一行解释了正在发生的事情:
DateFormatter formatter = (DateFormatter) ftf.getFormatter();
formatter.setAllowsInvalid(false); // here is the key
根据DefaultFormatter#setAllowsInvalid()文档:
public void setAllowsInvalid(boolean allowsInvalid)
设置是否允许正在编辑的值无效 一段时间(即
stringToValue
抛出ParseException
)。 允许用户临时输入通常很方便 无效的价值。
当您在false
中设置此属性时,您不允许用户键入无效值(例如,通过删除某些字符,或者在此特定情况下通过插入一些非数字字符),因此格式化程序正在尝试得到最接近的有效值。
这不是意料之外的行为,但必须与此方法提供的合同保持一致。