在JTextField中标记unicode行为

时间:2013-04-17 20:27:14

标签: java swing unicode jtextfield documentfilter

我正在编写一个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);
}

1 个答案:

答案 0 :(得分:2)

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

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

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

通过这种方式,您将捕获空格或换行符,回车符,制表符等,并将它们恢复到“顶部”替换的任一侧,以便文档保持完全相同,只是“顶部”变为“⊤”。