Java 具有DateFormatter删除行为的JSpinner
因此,我使用JSpinner.DateEditor创建了一个微调器,并稍微更改了格式化程序以验证用户输入Java 具有DateFormatter删除行为的JSpinner,java,swing,date-format,jspinner,Java,Swing,Date Format,Jspinner,因此,我使用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.get
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
有什么帮助吗?
谢谢基于此问题的标题和所描述的行为,发生的情况将在下面一行解释:
DateFormatter formatter = (DateFormatter) ftf.getFormatter();
formatter.setAllowsInvalid(false); // here is the key
根据文件:
public void setAllowsInvalid(布尔allowsInvalid)
设置是否允许正在编辑的值无效
在一段时间内(即,stringToValue
抛出一个ParseException
)。
允许用户临时输入
无效值
当您在false
中设置此属性时,不允许用户键入无效值(例如,通过删除某些字符,或在特定情况下通过插入一些非数字字符),因此格式化程序将尝试获取最接近的有效值
这不是意外行为,但必须与此方法提供的契约保持一致。没有解决方法,因为这不是错误或问题。事实上,格式化程序实际上处理无效输入是一个很大的优势。也许它不是用更好的方法来做的,但是考虑一下这些情况:A)新手用户可能会用鼠标,而不是键盘来改变旋转器的值。b) 高级用户可能会使用keayboard箭头来更新值,因此很少需要删除任何内容。在这两种情况下,这种行为都是用户可以忍受的@用户2628641