Unterschiedliche Fontfarbe in JTextField

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);
}

}
}

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:

[schnipp]

Also ich habe nur mal sehr kurz in die API geschaut und es scheint so, als ob Multicolor-Text mit einem JTextField respektive JTextArea nicht geht. Aber ich habe das hier gefunden: http://forum.java.sun.com/thread.jspa?threadID=67998…
Eine Lösung mit einer JTextPane bzw. deren Erweiterung.

Gruß,
Tobias