我正在编写一个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);
}
答案 0 :(得分:2)
我认为这很可能是由于用简单的空格替换非空格字边界(例如换行符或回车符)。因此,文本的流程正在改变。
看到\\b
锚点依赖于\\w
字符类,您可以匹配并捕获“top”两侧的\\W
个非单词字符,然后将其重新插入结果:
temp = temp.replaceAll("(\\W)top(\\W)", "$1\\\u22A4$2" );
通过这种方式,您将捕获空格或换行符,回车符,制表符等,并将它们恢复到“顶部”替换的任一侧,以便文档保持完全相同,只是“顶部”变为“⊤”。