Questo è un esempio completo.
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
public class ProvaFrame1 extends JFrame {
private static final long serialVersionUID = 1L;
private JTextArea textArea;
private ProgressiveHighlighter progrHighlighter;
private JButton searchButton;
public ProvaFrame1() {
super("Prova");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setSize(400, 300);
setLocationRelativeTo(null);
String msg = "Ciao, questo è un test al fine di testare il Highlighter\n";
textArea = new JTextArea(msg + msg + msg);
progrHighlighter = new ProgressiveHighlighter(textArea);
progrHighlighter.setPainter(new DefaultHighlightPainter(Color.GREEN));
progrHighlighter.setSearchText("test");
searchButton = new JButton("CERCA");
searchButton.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
progrHighlighter.nextHighlight();
}
});
add(new JScrollPane(textArea), BorderLayout.CENTER);
add(searchButton, BorderLayout.SOUTH);
}
public static void main(String[] args) {
SwingUtilities.invokeLater(new Runnable() {
public void run() {
new ProvaFrame1().setVisible(true);
}
});
}
}
class ProgressiveHighlighter {
private final JTextComponent textComponent;
private Highlighter.HighlightPainter painter;
private String searchText;
private Highlighter.Highlight currentHighlight;
public ProgressiveHighlighter(JTextComponent textComponent) {
this.textComponent = textComponent;
}
public void setPainter(Highlighter.HighlightPainter painter) {
this.painter = painter;
}
public void setSearchText(String searchText) {
this.searchText = searchText;
}
// altri getter/setter se necessari
public void nextHighlight() {
String text = textComponent.getText();
int fromIndex = currentHighlight == null ? 0 : currentHighlight.getEndOffset() + 1;
int resultIndex = text.indexOf(searchText, fromIndex);
if (resultIndex < 0 && fromIndex > 0) {
resultIndex = text.indexOf(searchText, 0);
}
if (resultIndex >= 0) {
Highlighter highlighter = textComponent.getHighlighter();
if (currentHighlight != null) {
highlighter.removeHighlight(currentHighlight);
}
try {
currentHighlight = (Highlighter.Highlight) highlighter.addHighlight(resultIndex, resultIndex+searchText.length(), painter);
} catch (BadLocationException e) {
// TODO
}
}
}
}
Nota come tutta la logica è ben incapsulata nella classe ProgressiveHighlighter. Tra l'altro ho anche gestito il fatto che la ricerca faccia il "giro" di nuovo dall'inizio! E ProgressiveHighlighter è comunque facilmente ben configurabile e riutilizzabile.
Nota anche come l'azione sul pulsante è solo e direttamente quel nextHighlight() .
Se c'è qualcosa di non chiaro, chiedi.