Highlighters

Highlighters determine how text is marked to make it stand out. The order in which we discuss the highlighter interfaces may seem counterintuitive. The basic Highlighter interface is so straightforward that you’ll rarely need to work with it directly, so we will describe it later. At this point, we discuss the interface you’re most likely to use first: the Highlighter.HighlightPainter interface.

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

public class LineHighlightPainter implements 
Highlighter.HighlightPainter {

	// Paint a thick line under one line of text, from r 
	// extending rightward to x2.
	private void paintLine(Graphics g, Rectangle r, int x2) {
		int ytop = r.y + r.height - 3;
		g.fillRect(r.x, ytop, x2 - r.x, 3);
	}

	// Paint thick lines under a block of text.
	public void paint(Graphics g, int p0, int p1, Shape bounds, 
JTextComponent c) 
        {
		Rectangle r0 = null, r1 = null, rbounds = bounds.getBounds();
		int xmax = rbounds.x + rbounds.width; 
// x-coordinate of right edge
		try { // Convert positions to pixel coordinates.
			r0 = c.modelToView(p0);
			r1 = c.modelToView(p1);
		} catch (BadLocationException ex) {
			return;
		}
		if ((r0 == null) || (r1 == null))
			return;

		g.setColor(c.getSelectionColor());

		// Special case if p0 and p1 are on the same line
		if (r0.y == r1.y) {
			paintLine(g, r0, r1.x);
			return;
		}

		// First line, from p1 to end-of-line
		paintLine(g, r0, xmax);

		// All the full lines in between, if any 
		// (assumes that all lines have the same height--not 
		// a good assumption with JEditorPane/JTextPane)

		r0.y += r0.height; // Move r0 to next line.
		r0.x = rbounds.x; // Move r0 to left edge.
		while (r0.y < r1.y) {
			paintLine(g, r0, xmax);
			r0.y += r0.height; // Move r0 to next line.
		}

		// Last line, from beginning-of-line to p1
		paintLine(g, r0, r1.x);
	}

	public static void main(String args[]) {

		// Extend DefaultCaret as an anonymous inner class.
		Caret lineHighlightPainterCaret = new DefaultCaret() {
			private Highlighter.HighlightPainter lhp = 
new LineHighlightPainter();

		// Override getSelectionPainter to return 
                // the LineHighlightPainter.
		protected Highlighter.HighlightPainter getSelectionPainter() {
		 return lhp;
			}
		};

		JFrame frame = new JFrame("LineHighlightPainter demo");
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		JTextArea area = new JTextArea(9, 45);
		area.setCaret(lineHighlightPainterCaret);
		area.setLineWrap(true);
		area.setWrapStyleWord(true);
		area.setText("This is the story\nof 
the hare who\nlost his spectacles.");
		frame.getContentPane().add(new JScrollPane(area), 
BorderLayout.CENTER);
		frame.pack();
		frame.setVisible(true);
	}
}