Hallo,
ich möchte in einem JTextField einzelne Textpassagen in anderer Farbe darstellen.
Konkret: Ich will ein Eingabefeld mit Autovervollständigung, bei dem die angehängten Texte in einer leicht grauen Schriftfarbe hinter der normal schwarzen auftauchen.
Mit dem DefaultHighlighter kann ich zwar komfortabel die Hintergrundfarbe der angehängten Bereiche einfärben, aber nicht den Text.
Hat jemand eine Idee?
Was ich bisher habe:
package guiteil;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Rectangle;
import java.awt.Shape;
import java.awt.event.KeyAdapter;
import java.awt.event.KeyEvent;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import javax.swing.JTextField;
import javax.swing.text.BadLocationException;
import javax.swing.text.DefaultHighlighter;
import javax.swing.text.Highlighter;
import javax.swing.text.JTextComponent;
import javax.swing.text.View;
public class JAutoCompleteTextField extends JTextField {
HashMap> ivMap = new HashMap>();
Highlighter ivHighlighter = new DefaultHighlighter();
JAutoCompleteTextField() {
setHighlighter(ivHighlighter);
addKeyListener(new KeyAdapter() {
private ArrayList possibleWord = new ArrayList();
private int position = 0;
public void keyReleased(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_DOWN
|| e.getKeyCode() == KeyEvent.VK_UP) {
boolean up = false;
if (e.getKeyCode() == KeyEvent.VK_UP) {
up = true;
}
if (possibleWord.size() > 0) {
if (ivHighlighter.getHighlights().length > 0) {
int start = ivHighlighter.getHighlights()[0]
.getStartOffset();
int end = ivHighlighter.getHighlights()[0]
.getEndOffset();
StringBuffer buf = new StringBuffer(getText());
if (up) {
if (position == 0) {
position = possibleWord.size() - 1;
} else {
position–;
}
} else {
if (position == possibleWord.size() - 1) {
position = 0;
} else {
position++;
}
}
buf.replace(start, end, possibleWord.get(position));
setText(buf.toString());
setCaretPosition(start
- possibleWord.get(position).length());
moveCaretPosition(start);
ivHighlighter.removeAllHighlights();
try {
ivHighlighter.addHighlight(start, start - possibleWord.get(position).length(),
new MyHighlightPainter());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
} else if (e.getKeyCode() == KeyEvent.VK_ENTER
|| e.getKeyCode() == KeyEvent.VK_RIGHT) {
if (ivHighlighter.getHighlights().length > 0) {
setCaretPosition(ivHighlighter.getHighlights()[0]
.getEndOffset());
ivHighlighter.removeAllHighlights();
}
} else if (e.getKeyCode() != KeyEvent.VK_BACK_SPACE) {
String s = getText();
if (s.length() > 0) {
int pos = getCaretPosition();
try {
Iterator i = ivMap.get(
s.substring(0, 1).toLowerCase()).iterator();
String ret = „“;
possibleWord.clear();
while (i.hasNext()) {
String ext = i.next();
if (ext.startsWith(s.toLowerCase())) {
possibleWord.add(ext.substring(s.length()));
}
}
Collections.sort(possibleWord,
new UmlautComparator());
if (possibleWord.size() > 0) {
ret = possibleWord.get(0);
}
StringBuffer buf = new StringBuffer(s);
buf.insert(pos, ret);
setText(buf.toString());
setCaretPosition(pos + ret.length());
moveCaretPosition(pos);
ivHighlighter.removeAllHighlights();
if (ret.length() > 0) {
try {
ivHighlighter.addHighlight(pos, pos
- ret.length(),
new MyHighlightPainter());
} catch (BadLocationException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
} catch (NullPointerException ex) {
ex.printStackTrace();
}
}
}
}
});
}
public void add(String str) {
String key = str.substring(0, 1).toLowerCase();
ArrayList list = ivMap.get(key);
if (list == null) {
ArrayList a = new ArrayList();
a.add(str.toLowerCase());
ivMap.put(key, a);
} else {
list.add(str);
}
}
public void add(List list) {
for (String str : list) {
add(str);
}
}
private class MyHighlightPainter extends
DefaultHighlighter.DefaultHighlightPainter {
public MyHighlightPainter() {
super(Color.gray);
}
}
}