CPU
Lieutenant
- Registriert
- Jan. 2006
- Beiträge
- 704
Hallo,
was ich erreichen möchte ist garnicht so viel: es sollen in einem JTextField (!!) alle "." grün angemalt werden (also Textfarbe).
Ich habe also ganz brav gegoogelt und habe eine Klasse gefunden, die schon etwas mit Highlight zutun hat (siehe ganz unten).
Doch: es wird immer nur der Hintergund angemalt. Wie kann ich in der "caretUpdate(...)"-Methode nun die Textfarbe für eine bestimmte Textpassage anders setzen?
Danke vorab,
CPU
was ich erreichen möchte ist garnicht so viel: es sollen in einem JTextField (!!) alle "." grün angemalt werden (also Textfarbe).
Ich habe also ganz brav gegoogelt und habe eine Klasse gefunden, die schon etwas mit Highlight zutun hat (siehe ganz unten).
Doch: es wird immer nur der Hintergund angemalt. Wie kann ich in der "caretUpdate(...)"-Methode nun die Textfarbe für eine bestimmte Textpassage anders setzen?
Danke vorab,
CPU
Code:
import java.awt.Color;
import java.awt.Font;
import javax.swing.JFrame;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.event.CaretEvent;
import javax.swing.event.CaretListener;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Document;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.DefaultHighlighter.DefaultHighlightPainter;
public class TestHighlightJTextField implements CaretListener {
/**
* The tags returned from the highlighter, used for clearing the current
* highlight.
*/
Object start, end;
/** The last highlighter used */
Highlighter highlighter;
/** Used to paint good parenthesis matches */
Highlighter.HighlightPainter goodPainter;
/** Used to paint bad parenthesis matches */
Highlighter.HighlightPainter badPainter;
private DefaultHighlightPainter ext;
/**
* Highlights using a good painter for matched parens, and a bad painter for
* unmatched parens
*/
TestHighlightJTextField(Highlighter.HighlightPainter goodHighlightPainter,
Highlighter.HighlightPainter badHighlightPainter) {
this.goodPainter = goodHighlightPainter;
this.badPainter = badHighlightPainter;
ext = new DefaultHighlighter.DefaultHighlightPainter(Color.green);
}
/** A BracketMatcher with the default highlighters (cyan and magenta) */
TestHighlightJTextField() {
this(new DefaultHighlighter.DefaultHighlightPainter(Color.cyan),
new DefaultHighlighter.DefaultHighlightPainter(Color.magenta));
}
public void clearHighlights() {
if (highlighter != null) {
if (start != null)
highlighter.removeHighlight(start);
if (end != null)
highlighter.removeHighlight(end);
start = end = null;
highlighter = null;
}
}
/** Returns the character at position p in the document */
public static char getCharAt(Document doc, int p)
throws BadLocationException {
return doc.getText(p, 1).charAt(0);
}
/**
* Returns the position of the matching parenthesis (bracket, whatever) for
* the character at paren. It counts all kinds of brackets, so the
* "matching" parenthesis might be a bad one. For this demo, we're not going
* to take quotes or comments into account since that's not the point.
*
* It's assumed that paren is the position of some parenthesis character
*
* @return the position of the matching paren, or -1 if none is found
**/
public static int findMatchingParen(Document d, int paren)
throws BadLocationException {
int parenCount = 1;
int i = paren - 1;
for (; i >= 0; i--) {
char c = getCharAt(d, i);
switch (c) {
case ')':
case '}':
case ']':
parenCount++;
break;
case '(':
case '{':
case '[':
parenCount--;
break;
}
if (parenCount == 0)
break;
}
return i;
}
/** Called whenever the caret moves, it updates the highlights */
public void caretUpdate(CaretEvent e) {
clearHighlights();
JTextComponent source = (JTextComponent) e.getSource();
highlighter = source.getHighlighter();
Document doc = source.getDocument();
// The character we want is the one before the current position
int closeParen = e.getDot() - 1;
try {
char c = getCharAt(doc, closeParen);
if (c == ')' || c == ']' || c == '}') {
int openParen = findMatchingParen(doc, closeParen);
if (openParen >= 0) {
char c2 = getCharAt(doc, openParen);
if ((c2 == '(' && c == ')') || (c2 == '{' && c == '}')
|| (c2 == '[' && c == ']')) {
start = highlighter.addHighlight(openParen,
openParen + 1, goodPainter);
end = highlighter.addHighlight(closeParen,
closeParen + 1, goodPainter);
} else {
start = highlighter.addHighlight(openParen,
openParen + 1, badPainter);
end = highlighter.addHighlight(closeParen,
closeParen + 1, badPainter);
}
} else {
end = highlighter.addHighlight(closeParen, closeParen + 1,
badPainter);
}
}
} catch (BadLocationException ex) {
throw new Error(ex);
}
}
/** A demo main */
public static void main(String a[]) {
JFrame f = new JFrame();
JTextField p = new JTextField();
f.getContentPane().add(new JScrollPane(p));
p.setFont(new Font("Monospaced", 0, 12));
p.addCaretListener(new TestHighlightJTextField());
f.setSize(400, 400);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setVisible(true);
}
}