2013-10-17 54 views
2

我有一個問題:突出的JTextArea

 int index = text.indexOf(myWord); 

     while (index >= 0) { 
      int len = pattern.length(); 
      hl.addHighlight(index, index + len, DefaultHighlighter.DefaultPainter); 
      index = text.indexOf(pattern, index + len); 
     } 

當我到達行高亮結束時仍使,如何禁用亮點? 上面代碼的結果是:

enter image description here

感謝的答案,但問題是:

enter image description here

黑線是我點擊並開始輸入的地方,它只是錯誤。

+0

是返回正確的長度pattern.length()?提供的答案使用與您一樣的代碼。 – dARKpRINCE

+0

+1更新。 – dic19

回答

8

那麼我不得不對你的變量名做一些假設,我希望我做對了。基本上你的代碼爲我工作,但我不明白的第一行:

int index = text.indexOf(myWord); 

我覺得應該是:

int index = text.indexOf(pattern); 

不管怎麼說,我寫了這個代碼和它的工作對我來說:

String pattern = "<aa>"; 
String text = textArea.getText();   
int index = text.indexOf(pattern); 
while(index >= 0){ 
    try {     
     hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter); 
     index = text.indexOf(pattern, index + pattern.length());    
    } catch (BadLocationException ex) { 
     ex.printStackTrace(); 
    } 
} 

更新

看起來當你點擊已標記文本的末尾並開始輸入時,文字也會被標記 - 這是我的錯誤。

對不起,我以前沒有看到。我不認爲你可以停止一個熒光筆,但你可以使用CaretListener和做那裏的東西。這樣,如果您輸入您的模式相匹配的新字符串,它也將被高亮顯示:

textArea.addCaretListener(new CaretListener() {    
    @Override 
    public void caretUpdate(CaretEvent e) { 
     if(e.getMark() == e.getDot()){ 
      Highlighter hl = textArea.getHighlighter(); 
      hl.removeAllHighlights(); 

      String pattern = "<aa>"; 
      String text = textArea.getText();   
      int index = text.indexOf(pattern); 
      while(index >= 0){ 
       try {     
        Object o = hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter); 
        index = text.indexOf(pattern, index + pattern.length()); 
       } catch (BadLocationException ex) { 
        ex.printStackTrace(); 
       } 
      } 
     } 
    } 
}); 

e.getMark() == e.getDot()的意思是「沒有文本選擇」基於CaretEvent.getDot()CaretEvent.getMark()的javadoc。否則,你不應該突出顯示除選定文本外的任

截圖

enter image description here

更新SSCCE

下面是一個完整SSCCE來測試它:

import java.awt.Dimension; 
import java.awt.FlowLayout; 
import javax.swing.JFrame; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTextArea; 
import javax.swing.SwingUtilities; 
import javax.swing.event.CaretEvent; 
import javax.swing.event.CaretListener; 
import javax.swing.text.BadLocationException; 
import javax.swing.text.DefaultHighlighter; 
import javax.swing.text.Highlighter; 

public class Demo { 

    private void initGUI(){ 

     final JTextArea textArea = new JTextArea(); 

     textArea.addCaretListener(new CaretListener() {    
      @Override 
      public void caretUpdate(CaretEvent e) { 
       if(e.getMark() == e.getDot()){ 
        Highlighter hl = textArea.getHighlighter(); 
        hl.removeAllHighlights(); 

        String pattern = "<aa>"; 
        String text = textArea.getText();   
        int index = text.indexOf(pattern); 
        while(index >= 0){ 
         try {     
          Object o = hl.addHighlight(index, index + pattern.length(), DefaultHighlighter.DefaultPainter); 
          index = text.indexOf(pattern, index + pattern.length()); 
         } catch (BadLocationException ex) { 
          ex.printStackTrace(); 
         } 
        } 
       } 
      } 
     }); 

     JScrollPane scrollPane = new JScrollPane(textArea); 
     scrollPane.setPreferredSize(new Dimension(300,200)); 

     JPanel content = new JPanel(new FlowLayout()); 
     content.add(scrollPane); 

     JFrame frame = new JFrame("Demo"); 
     frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE); 
     frame.setContentPane(content); 
     frame.pack(); 
     frame.setLocationRelativeTo(null); 
     frame.setVisible(true);   
    } 


    public static void main(String[] args) {   
     SwingUtilities.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       new Demo().initGUI(); 
      } 
     }); 
    } 

} 
+0

基本上這是與問題中相同的代碼...不是嗎?但是在SSCCE方面做出了很好的努力。 +1 – dARKpRINCE

+0

你說得對。我的第二句話寫*基本上你的代碼爲我工作,但我不明白第一行* – dic19

+0

感謝您的答案,看看當你點擊標記文本的結尾,並開始輸入文字也將被標記 - 它是一個我的錯誤。 –