5

JTextArea で一部のテキストを強調表示しましたが、強調表示を手動で選択できません。どうすればこれを行うことができますか?

jTextArea.getHighlighter().addHighlight(0,5);
jTextArea.getHighlighter().removeHighlight(jTextArea.getSelectionStart(),jTextArea.getSelectionEnd());

ユーザーが選択したハイライトを削除しようとすると、選択の開始と終了が同じものとして表示されるため、選択したテキスト (textArea.getSelectedText()) が null になります。

ユーザーが選択したハイライトを削除したい。

キーボードを使用して選択すると、選択する必要があります。そうですか?もう 1 つは、テキストが選択されているときにハイライトを削除してはならないということです。

どんな解決策でも大歓迎です。

4

1 に答える 1

7

Grrr を使用するSimpleAttributeSetのではなく、より簡単な解決策を見つけましたJTextPane StyledDocument

魔法は次の場所で起こります: でStyleConstants.setBackground(sas, Color.RED);ある可能性もありますsetForeground(..)

テキストを選択する場合よりも、強調表示されたテキスト (画像 2) をカバーする内部蛍光ペンが適用されます。これはドキュメント レベルで行われたためJTextPane、デフォルトで使用されるユーザー選択蛍光ペンを完全に妨げません。

ここをチェックしてください:

アプリの起動時:

ここに画像の説明を入力

テキストを選択した後:

ここに画像の説明を入力

import java.awt.Color;
import javax.swing.JFrame;
import javax.swing.JTextPane;
import javax.swing.SwingUtilities;
import javax.swing.text.SimpleAttributeSet;
import javax.swing.text.StyleConstants;
import javax.swing.text.StyledDocument;

public class HighlightTest {

    String[] words = new String[]{"world", "cruel"};
    int[] wordsStartPos = new int[]{6, 21};
    String text = "Hello world, Goodbye cruel world";

    public HighlightTest() {

        SwingUtilities.invokeLater(new Runnable() {
            @Override
            public void run() {

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);

                JTextPane jta = new JTextPane();

                jta.setText(text);

                SimpleAttributeSet sas = new SimpleAttributeSet();
                StyleConstants.setBackground(sas, Color.RED);
                StyledDocument doc = jta.getStyledDocument();

                for (int i = 0; i < wordsStartPos.length; i++) {
                    doc.setCharacterAttributes(wordsStartPos[i], words[i].length(), sas, false);
                }
                frame.add(jta);

                frame.pack();
                frame.setVisible(true);
            }
        });
    }

    public static void main(String[] args) {
        new HighlightTest();
    }
}
于 2013-06-29T07:43:56.247 に答える