JTextArea - 向上或向下滚动时突出显示文本

时间:2012-06-08 16:34:04

标签: java swing jscrollpane jtextarea

我正在尝试使用添加到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

(即两条特定数据行之间可能有新行)

1 个答案:

答案 0 :(得分:2)

你的要求并不容易。首先使用JTextPane而不是JTextArea,它将更容易处理。您将需要从中获取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类,它将真正帮助您。