【问题标题】:What do each of the methods (and arguments of) of DocumentFilter do exactly?DocumentFilter 的每个方法(和参数)究竟做了什么?
【发布时间】:2015-12-18 01:46:15
【问题描述】:

我一直在努力解决这个 DocumentFilter 业务,就在我觉得自己基本了解它的时候,我尝试了一个简单的测试用例,但没有任何意义。

所以最初的目标是创建一个简单的 DocumentFilter 来只允许数字,包括小数。我做了一些研究并阅读了 StackOverflow 上已经存在的一些帖子,这些帖子非常详细地描述了这个过程。感谢那些发帖的人。我还第一次阅读了 Regex,并且对它的多功能性感到震惊。

继续前进,我编写(主要是复制)其中一个示例并在我的程序上进行了尝试,但由于某种原因它无法正常工作。我决定回归基础,尝试一个非常简单的 DocumentFilter 子类:

public class SomeFilter extends DocumentFilter {

    public void insertString(FilterBypass fb, int offs, String str,
        AttributeSet a) throws BadLocationException {

        if (str.matches("B")) super.insertString(fb, offs, str, a);
    }

    public void replace(FilterBypass fb, int offs, int len, String str,
        AttributeSet a) throws BadLocationException {

        if (str.matches("A")) super.replace(fb, offs, len, str, a);
    }
}

这才是真正让我失望的地方。从 oracle 文档中,我读到 insertString 是插入内容(我假设光标在哪里),replace 是替换(例如复制和粘贴)。现在很明显我在这里误解了一些东西,因为我使用 setDocumentFilter 的 JTextField 只允许我“插入”A 而不是 B。有人可以解释一下这些方法的实际工作原理吗?

如果我能解决这个问题,我稍后会发布我对实际 IntegerFilter 所做的事情,看看我是否也能解决这个问题。

【问题讨论】:

    标签: java swing documentfilter


    【解决方案1】:

    当您在JTextComponent 中键入文本时,将调用DocumentFilterreplace(...) 方法。这是因为 JTextComponentreplaceSelection(...) 方法最终会被文本插入操作调用。

    如果您使用DocumentinsertString(...) 方法将文本直接插入Document,则将调用DocumentFilterinsertString(...) 方法。

    【讨论】:

    • 那么对于我只是试图过滤数字的 JTextField,是否有任何理由甚至覆盖 insertString 方法?
    • @EdwardGuo 不是真的,但我总是创建一个可以从 replace() 和 insertString() 方法调用的方法,以防万一您添加代码来手动更新 Document。
    • @EdwardGuo,文本组件使用的replaceSelection(...) 方法需要处理选择文本和在文本组件中键入/粘贴文本时未选择文本的情况。因此使用了一个方法,它映射到DocumentFilter 中的一个方法。
    • 所以,您的问题已经得到解答。您的问题不是关于如何编写整数过滤器。你为什么还要为这样一个不需要的复杂正则表达式而烦恼?只需使用Integer.parseInt(...)
    • 等等,什么?我将如何使用它来检查输入是否是数字?抱歉,我想它也应该是 DoubleFilter 更具体。
    【解决方案2】:

    DocumentFilter 类的文档可以在 here 找到你在类中有三个方法:

    插入字符串():

    insertString(DocumentFilter.FilterBypass fb, int offset, String string, AttributeSet attr)
    

    在将文本插入指定文档之前调用。

    删除():

    remove(DocumentFilter.FilterBypass fb, int offset, int length)
    

    在删除指定文档中的指定区域之前调用。

    替换():

    replace(DocumentFilter.FilterBypass fb, int offset,
         int length, String text, AttributeSet attrs)
    

    在替换指定文档中的文本区域之前调用。

    InsertString() 方法似乎用于编辑文档。根据我过去的经验,要更改 JTextField 中的文本,您需要使用像 this 示例这样的 DocumentListener。

    【讨论】:

      猜你喜欢
      • 2021-04-26
      • 2019-01-28
      • 2020-05-29
      • 2015-04-03
      • 2011-07-23
      • 2012-07-23
      • 2016-09-10
      • 2023-03-15
      • 2012-10-17
      相关资源
      最近更新 更多