2012-06-08 49 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 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類,它會真的幫助你很多。

+0

謝謝@george_h,這是我想要實現的一個好開始。 – Sujay

相關問題