Java 使用文档筛选器筛选多个期间(.)
假设用户必须在Jtextfield中输入一个双精度值,然后进行计算。Java 使用文档筛选器筛选多个期间(.),java,swing,jtextfield,documentfilter,Java,Swing,Jtextfield,Documentfilter,假设用户必须在Jtextfield中输入一个双精度值,然后进行计算。 但是,如果用户突然使用了超过1个句点,则会触发NumberFormatException,因此我假设解决方案是使用文档过滤器过滤掉任何额外的句点,或者捕获异常并通知用户无效的输入 当前使用DocumentFilter只允许数字和句点,但我的问题是如何过滤掉第二个句点 PlainDocument filter = new PlainDocument(); filter.setDocumentFilter(
但是,如果用户突然使用了超过1个句点,则会触发NumberFormatException,因此我假设解决方案是使用文档过滤器过滤掉任何额外的句点,或者捕获异常并通知用户无效的输入 当前使用DocumentFilter只允许数字和句点,但我的问题是如何过滤掉第二个句点
PlainDocument filter = new PlainDocument();
filter.setDocumentFilter(new DocumentFilter() {
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException
{
fb.insertString(off, str.replaceAll("[^0-9.]", ""), attr);
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException
{
fb.replace(off, len, str.replaceAll("[^0-9.]", ""), attr);
}
});
apm.setDocument(filter);
范例
无效的
投入:1.2.2
有效的
输入:1.22是,使用try-catch块。在try块中实现快乐路径(即正确格式化的数字),并在catch块中实现错误案例。例如,如果您想突出显示红色框或弹出错误消息,您可以将该逻辑放入(或从)catch块中调用。我的建议是,您可以更改重写的
insertString
和replace
方法,以便它检查是否有”
在本次插入或替换之前已插入,并以一种方式更改过滤器,即如果用户随后插入期间
字符,则“期间”将替换为空白字符串。我已举例说明如下:
@Override
public void insertString(FilterBypass fb, int off, String str, AttributeSet attr)
throws BadLocationException {
String regExp;
Document doc = fb.getDocument();
if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
regExp = "[^0-9.]";
} else {
regExp = "[^0-9]";
}
fb.insertString(off, str.replaceAll(regExp, ""), attr);
}
@Override
public void replace(FilterBypass fb, int off, int len, String str, AttributeSet attr)
throws BadLocationException {
String regExp;
Document doc = fb.getDocument();
if(doc.getText(0, doc.getLength()).indexOf(".") == -1){
regExp = "[^0-9.]";
} else {
regExp = "[^0-9]";
}
fb.replace(off, len, str.replaceAll(regExp, ""), attr);
}
上述代码只允许在设置了此
DocumentFilter
的文档中插入一次“period”。不知道谈论什么,对我来说很有用,为了更好地帮助我尽快发布一个简短、可运行、可编译的筛选器,我会将筛选器编码为不允许第二个period。你试过什么?它怎么不工作?你好@mKorbel!我自己,我将等待SSCE。@HovercraftFullOfEels-im还使用DocumentListener计算值。或者使用JFormattedTextField
,如图所示