1

JScrollPaneに追加された編集不可能なJTextAreaを操作しようとしています。ユーザーがその特定の行をクリックしたときに行が強調表示されるようにしたい。次のコードを使用して、この部分を実装できます。

public static void initHighlightOption(final JTextArea textArea){

    textArea.setFont(new Font("Courier New", Font.PLAIN, 12));
    textArea.setEditable(false);

    final Action selectLine = getAction(textArea, DefaultEditorKit.selectLineAction);

    textArea.addMouseListener(new MouseAdapter() {

        @Override
        public void mouseClicked(MouseEvent e) {
            if (SwingUtilities.isLeftMouseButton(e) && e.getClickCount() == 1) {
                selectLine.actionPerformed(null);
            }
     });

    textArea.setSelectionStart(0);
    textArea.setSelectionEnd(0);
}

public static Action getAction(JTextArea textArea, String name) {
    Action action = null;
    Action[] actions = textArea.getActions();

    for (int i = 0; i < actions.length; i++) {
        if (name.equals(actions[i].getValue(Action.NAME).toString())) {
            action = actions[i];
            break;
        }
    }

    return action;
}

追加したいのは、行が強調表示され、ユーザーがキーボードの上下キーを使用して上下にスクロールしたら、現在の行を強調表示したいということです。keyListenerを追加することでこれは可能ですか?上にスクロールしているときにデータをハイライトする方法に固執しています。

テキスト領域には、次のようなデータが含まれています。

Line1
Line2

Line3

Line4
Line5

(つまり、2つの特定のデータ行の間に新しい行がある可能性があります)

4

1 に答える 1

2

あなたが求めていることは、そう簡単にできるものではありません。まず、JTextArea の代わりに JTextPane を使用すると、処理がはるかに簡単になります。そこから Highlighter オブジェクトを取得する必要があります

Highlighter hl = textPane.getHighlighter();

ユーザーが矢印キーでスクロールするたびに、キャレットの位置を追跡する必要があるでしょう。その場合、ハイライトをプログラムで変更する必要があります。何かのようなもの:

Highlighter.Highlight myHighlight = null;
Highlighter.Highlight[] highlights = textPane.getHighlighter().getHighlights();
myHighlight = highlights[0]; //assuming there is one only

try {
      hl.changeHighlight(myHighlight, myHighlight.getStartOffset()+1, myHighlight.getEndOffset());
}
catch(BadLocationException e) {
      e.printStackTrace();
}

おそらくこれを onKeyReleased() メソッドに入れることができます。自分が何をしなければならないかについてのアイデアを得ることができます。Java API ドキュメントで JTextPane および Highlighter クラスの使用について読んでください。非常に役立ちます。

于 2012-06-08T17:30:20.477 に答える