2015-11-14 54 views
1

我一直在尋找一種方式來突出JTextArea中所選擇的線路。關於如何在JTextArea中突出顯示文本,有許多帖子,但它只能在字母去。我希望能夠突出顯示整行(很像Eclipse日誌編輯器突出顯示當您單擊某行時所在的整個當前行)。我發現的所有文章都提出了Highlighter對象,但我不確定這是否會突出顯示JTextArea的非字符區域。另外,有沒有辦法找到JTextArea中選定的行是什麼?不是有多少行,而是選擇的行(有人點擊回到較早的點)。或者這是一個非常複雜的過程來計算?突出顯示所選線的JTextArea

回答

5

您需要打開分層亮點關:

import java.awt.*; 
import java.awt.event.*; 
import javax.swing.*; 
import javax.swing.text.*; 

public class SSCCE extends JPanel 
{ 
    public SSCCE() 
    { 
     JTextArea textArea = new JTextArea(4, 30); 
     textArea.setText("one\ntwo\nthree"); 
     add(new JScrollPane(textArea)); 


     DefaultHighlighter highlighter = (DefaultHighlighter)textArea.getHighlighter(); 
     DefaultHighlighter.DefaultHighlightPainter painter = new DefaultHighlighter.DefaultHighlightPainter(Color.RED); 
     highlighter.setDrawsLayeredHighlights(false); // this is the key line 

     try 
     { 
      int start = textArea.getLineStartOffset(1); 
      int end = textArea.getLineEndOffset(1); 
      highlighter.addHighlight(start, end, painter); 
     } 
     catch(Exception e) 
     { 
      System.out.println(e); 
     } 
    } 


    private static void createAndShowGUI() 
    { 
     JFrame frame = new JFrame("SSCCE"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.add(new SSCCE()); 
     frame.setLocationByPlatform(true); 
     frame.pack(); 
     frame.setVisible(true); 
    } 

    public static void main(String[] args) 
    { 
     EventQueue.invokeLater(() -> createAndShowGUI()); 
/* 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
*/ 
    } 
} 

您可能還需要檢查出Line Painter類將突出對當前行插入符移動。所以這個班級將管理重點。這是隨着插入符號逐行移動,先前的突出顯示被刪除並添加新的突出顯示。