我正在写一个DocumentFilter,用逻辑顶部符号替换输入到JTextField中的所有“顶部”一词。

使用此代码很好,但是很烦人,因为用户必须重新输入他们的空格,他们可以这样做并且文本在同一行上继续

temp.replaceAll("\\btop\\b", "\\\u22A4" );


使用此代码并在空格中添加替换字符会导致顶部符号和JTextField中的所有文本在用户继续键入文本时被略微上推,然​​后在其下方并开始新的一行

temp.replaceAll("\\btop\\b", "\\\u22A4 " );


谁能解释这种现象并希望提供解决方案?谢谢。

 @Override
    public void replace(FilterBypass fb, int offset, int length,
        String string, AttributeSet attr)
            throws BadLocationException {
        int totalLength = fb.getDocument().getLength();
        String temp   = fb.getDocument().getText(0, totalLength);
        temp = temp.replaceAll("\\btop\\b",     "\\\u22A4" );  //needs space
        super.remove(fb, 0, totalLength);
        super.insertString(fb, 0, temp, attr);
        super.replace(fb, offset, length, string, attr);
}

最佳答案

我认为这很可能是由于您用一个简单的空格替换了非空格的单词边界(例如换行符或回车符)。因此,文本的流向正在改变。

看到\\b锚依赖于\\w字符类,您可以改为匹配并捕获“ top”两侧的\\W非单词字符,然后将它们重新插入结果中:

temp = temp.replaceAll("(\\W)top(\\W)", "$1\\\u22A4$2" );


这样,您将捕获空格或换行符,回车符,制表符等,并在“ top”替换项的任一侧恢复它们,以便文档保持完全相同,只是“ top”变为“⊤”。

10-07 20:45