5

Java で単純な WYSIWYG RTF エディターを開発していますが、小さな問題があります。スタイル選択トグル ボタン (太字、斜体、下線など) をユーザーのテキスト選択に同期できるようにする必要があります。たとえば、現在のテキスト選択がプレーンの場合、太字、斜体、および下線付きのトグル ボタンは選択されませんが、ユーザーが太字と下線付きのテキストを選択すると、太字と下線付きのトグル ボタンが選択されます。

これで、必要な選択属性が得られると確信していJTextPane.getInputAttributes()ますが、キャレット更新イベントのリッスンに問題があります。問題は、にアタッチされたキャレットリスナーがJTextPane、入力属性の変更が発生した後に呼び出されるように見えることです。そのため、選択は常に一歩遅れています。つまり、トグル ボタンが更新される前に、テキストを 2 回選択する必要があります。

ここで重要なコードは次のとおりです。

textPane.addCaretListener(new CaretListener() {

        @Override
        public void caretUpdate(CaretEvent e) {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });

と:

private void syncAttributesWithUI(AttributeSet attributes) {
    boldButton.setSelected(StyleConstants.isBold(attributes));
    italicButton.setSelected(StyleConstants.isItalic(attributes));
    underlineButton.setSelected(StyleConstants.isUnderline(attributes));
}

前もって感謝します!

4

2 に答える 2

1

CaretListenerをリッスンしていますtextPaneが、選択の既存の属性はにありますDocumentCaretEventメソッドを使用して、の選択された部分を検索し、Documentそこで見つかったスタイルに基づいてボタンを調整できます。残念ながら、選択は一貫性がない可能性があります。たとえば、一部が太字で一部が斜体です。一般的な方法は、ユーザーが完全に新しい属性のセットを選択全体に適用したいと想定することです。

于 2010-01-30T20:20:45.280 に答える
0

同期を延期して、他の変更が最初に発生するようにすることもできます。

@Override
public void caretUpdate(CaretEvent e) {
    SwingUtilities.invokeLater(new Runnable() {
        @Override
        public void run() {
            syncAttributesWithUI(textPane.getInputAttributes());
        }
    });
}

(免責事項:頭のてっぺんからの推測です-実際に確認するためのテストを書きませんでした)

于 2010-02-09T14:55:24.570 に答える