كما يقال، صورة خير من ألف تعليق
يمكن استعمال هذا المكون كالتالي
HighlightedTextArea txt = new HighlightedTextArea();
هذا الconstructor يستعمل اللون الأصفر لرسم الhighlight
HighlightedTextArea txt = new HighlightedTextArea(Color.lightgray);
يمكن تغيير لون الhighlight باستعمال هذا constructor، بالطبع يجب تمرير كائن من فئة Color
يمكن إضافة هذا المكون إلى أي حاوي مثل أي مكون swing
HighlightedTextArea txt = new HighlightedTextArea(); JPanel pn = new JPanel(); pn.add(txt);
وهذه شيفرة الكلاس
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import javax.swing.JTextArea;
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;
import javax.swing.text.Highlighter.HighlightPainter;
import javax.swing.text.JTextComponent;
/**
*
* @author herch
*/
public class HighlightedTextArea extends JTextArea {
private Highlighter lineHighlighter;
private LineHighlightPainter highlightPainter;
private Color highlightColor;
public HighlightedTextArea(Color highlightColor) {
this.highlightColor = highlightColor;
lineHighlighter = new DefaultHighlighter();
highlightPainter = new LineHighlightPainter();
setHighlighter(lineHighlighter);
addMouseListener(new MouseAdapter() {
@Override
public void mousePressed(MouseEvent e) {
highlightCurrentLine();
}
});
addCaretListener(new CaretListener() {
public void caretUpdate(CaretEvent e) {
if (getCaret().getDot() == getCaret().getMark()) {//if no selection
highlightCurrentLine();
}
}
});
}
public HighlightedTextArea() {
this(Color.YELLOW);
}
private void highlightCurrentLine() {
try {
lineHighlighter.removeAllHighlights();//remove all the previous highlights int the textarea
lineHighlighter.addHighlight(getCaretPosition(), 0, highlightPainter);//we set the highlight on the current line
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
class LineHighlightPainter implements HighlightPainter {
public void paint(Graphics g, int p0, int p1, Shape bounds, JTextComponent c) {
JTextArea t = (JTextArea) c;
try {
Rectangle r = t.modelToView(p0);//Converts the location in the model(text) to a place in the view coordinate system
g.setColor(highlightColor);
g.fillRect(0, r.y, t.getWidth(), r.height);
} catch (BadLocationException ex) {
ex.printStackTrace();
}
}
}
}