2012-06-08 8 views
1

Я пытаюсь работать с редактируемым 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 

(т.е. там могут быть новые линии между двумя конкретными линиями данных)

ответ

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(). Вы понимаете, что вам нужно делать. Прочитайте, используя классы JTextPane и Highlighter в документах API Java API, это действительно поможет вам.

+0

Спасибо @george_h, это хорошее начало для того, чего я пытаюсь достичь. – Sujay

Смежные вопросы