2

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

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

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);
}
4

1 回答 1

2

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

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

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

这样,您将捕获空格或换行符、回车符、制表符等,并将它们恢复到“顶部”替代的任一侧,以便文档保持完全相同,除了“顶部”已变为“⊤”。

于 2013-04-17T20:48:30.990 回答