那麼我不得不對你的變量名做一些假設,我希望我做對了。基本上你的代碼爲我工作,但我不明白的第一行:
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。否則,你不應該突出顯示除選定文本外的任
截圖
更新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();
}
});
}
}
是返回正確的長度pattern.length()?提供的答案使用與您一樣的代碼。 – dARKpRINCE
+1更新。 – dic19