Hallo,
ich arbeite gerade an einem Projekt, wo der Benutzer eine Eingabe tätigt, und sobald er die Leertaste drückt, wird die Eingabe überprüft. Ich habe eine Liste Wörter und eines dieser Wörter in dem Eingabetext vorkommt, soll dieses farbig und fett gemacht werden.
Da dies in einer JTextArea nicht möglich ist, habe ich mir eine Klasse geschrieben, die von JEditorPane erbt. Der Konstruktor der Klasse sieht wie folgt aus:
[CODE lang="java" title="Konstruktor"]public SyntaxHighlighter()
{
this.setFocusable(true);
this.setEditable(true);
this.setContentType("text/html");
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE)
{
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE)
{
try
{
String[] text = getDocument().getText(0, getDocument().getLength()).split(" ");
setText(highlightText(text));
}
catch( BadLocationException ex ) {
ex.printStackTrace();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}[/CODE]
Die Methode highlightText sieht wiefolgt aus:
[CODE lang="java" title="highlightText"]public static String highlightText(String[] text)
{
StringBuilder sb = new StringBuilder();
sb.append("<html><body>");
for (int i=0; i < text.length; i++)
{
if (isSchlüsselwort(text))
{
String s = "<font color=\"blue\"><b>" + text + "</b>";
sb.append(s);
}
else
{
sb.append(text + " ");
}
}
sb.append("</body></html>");
return sb.toString();
}[/CODE]
Die Methode isSchlüsselwort iteriert über die Wörterliste und gleicht mittels equalsIgnoreCase ab, ob der übergebene String in der Liste vorkommt.
Mein Problem ist, das dies nicht so wirklich zuverlässig ist, z.B. wenn ich als erstes ein Wort, welches in der Liste vorkommt, eingebe, wird es nicht gefärbt. Da ich mich mit html nicht so gut auskenne, finde ich leider den Fehler nicht. Es passiert auch, dass Wörter die nicht in der Liste sind, blau werden.
Falls es eine bessere Möglichkeit gibt, das oben beschrieben zu tun, dann bin ich gerne für Vorschläge offen
ich arbeite gerade an einem Projekt, wo der Benutzer eine Eingabe tätigt, und sobald er die Leertaste drückt, wird die Eingabe überprüft. Ich habe eine Liste Wörter und eines dieser Wörter in dem Eingabetext vorkommt, soll dieses farbig und fett gemacht werden.
Da dies in einer JTextArea nicht möglich ist, habe ich mir eine Klasse geschrieben, die von JEditorPane erbt. Der Konstruktor der Klasse sieht wie folgt aus:
[CODE lang="java" title="Konstruktor"]public SyntaxHighlighter()
{
this.setFocusable(true);
this.setEditable(true);
this.setContentType("text/html");
this.addKeyListener(new KeyListener() {
@Override
public void keyTyped(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE)
{
}
}
@Override
public void keyPressed(KeyEvent e) {
if (e.getKeyCode() == KeyEvent.VK_SPACE)
{
try
{
String[] text = getDocument().getText(0, getDocument().getLength()).split(" ");
setText(highlightText(text));
}
catch( BadLocationException ex ) {
ex.printStackTrace();
}
}
}
@Override
public void keyReleased(KeyEvent e) {
}
});
}[/CODE]
Die Methode highlightText sieht wiefolgt aus:
[CODE lang="java" title="highlightText"]public static String highlightText(String[] text)
{
StringBuilder sb = new StringBuilder();
sb.append("<html><body>");
for (int i=0; i < text.length; i++)
{
if (isSchlüsselwort(text))
{
String s = "<font color=\"blue\"><b>" + text + "</b>";
sb.append(s);
}
else
{
sb.append(text + " ");
}
}
sb.append("</body></html>");
return sb.toString();
}[/CODE]
Die Methode isSchlüsselwort iteriert über die Wörterliste und gleicht mittels equalsIgnoreCase ab, ob der übergebene String in der Liste vorkommt.
Mein Problem ist, das dies nicht so wirklich zuverlässig ist, z.B. wenn ich als erstes ein Wort, welches in der Liste vorkommt, eingebe, wird es nicht gefärbt. Da ich mich mit html nicht so gut auskenne, finde ich leider den Fehler nicht. Es passiert auch, dass Wörter die nicht in der Liste sind, blau werden.
Falls es eine bessere Möglichkeit gibt, das oben beschrieben zu tun, dann bin ich gerne für Vorschläge offen