2

JTextField に入力されたすべての単語「top」を論理的な top 記号に置き換える DocumentFilter を作成しています。

このコードを使用しても問題ありませんが、ユーザーがスペースを再入力する必要があり、テキストが同じ行に続くため、面倒です。

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

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

そうすれば、スペースや改行、改行、タブなどをキャプチャし、「トップ」代替の両側にそれらを復元して、「トップ」が「⊤」になることを除いてドキュメントがまったく同じままになるようにします。

于 2013-04-17T20:48:30.990 に答える