Wer schon einmal versucht hat, einen halbwegs brauchbaren Editor unter Java zu schreiben, der weià um die Schwierigkeiten mit der Komponente JEditorPane: für jedes Format muss ein brauchbarer EditorKit her, um ein Einfügen oder Bearbeiten des Textes zu erlauben.
Der EditorKit HTMLEditorKit reicht für das Anzeigen einfacher HTML-Dokumente aus. Wie geht es aber weiter, wenn man beispielsweise eine Textstelle umformatieren möchte? Kann man einfach ein HTML-Tag wie <strong>...</strong> einfügen, um Text fett darzustellen? Wer es einmal ausprobiert, wird feststellen: Es reicht nicht.
Diese Erkenntnis habe ich auch gewonnen. Ein Blick in die API-Dokumentation brachte mich auch nicht weiter. Aber eine kurze Recherche im Netz hat schliesslich folgenden Codeschnippsel zu Tage gefördert:
HTMLDocument html = (HTMLDocument) editorPane.getDocument();
HTMLEditorKit kit = (HTMLEditorKit) editorPane.getEditorKit();
try {
String s = ""+html.getText(start, end - start)+"";
// remove old, change to bold
html.remove(start, end - start);
kit.insertHTML(html, start, s, 0, 0, HTML.Tag.STRONG);
} catch (BadLocationException e1) {
e1.printStackTrace();
} catch (IOException e1) {
e1.printStackTrace();
}
Als erstes wird in Zeile 1 + 2 ein HTMLDocument und der zuständige HTMLEditorKit aus dem JEditorPane geholt. Anschliessend wird der ausgewählte Text mit den Tags <strong>...</strong> umschlossen. Zeile 5 entfernt anschliessend den ausgewählten Text und Zeile 6 fügt den Text inklusive HTML-Tag wieder an der gleichen Stelle ein.
Zeile 6 ist die wichtigste Stelle in diesem Code. Sie fügt nicht nur den Text ein, sie enthält auch Informationen über die Formatierung. HTML.Tag.STRONG zeichnet den eingefügten Text als Fettdruck aus. Der EditorKit benutzt diese Formatierung, um sie dem Parser zur Darstellung bekannt zu machen. Die Tags allein als reinen Text einzufügen, würde nur die Anzeige von <strong<...</strong> zur Folge haben.
Was passiert nun aber, wenn man an der gleichen Stelle eine weitere Formatierung einfügen möchte? Eigenlich sollten die äuÃeren Tags erhalten bleiben und eine tiefere Ebene sollte mit der neuen Formatierung erzeugt werden. Leider ist das nicht der Fall. Wenn z.B. eine kursive Textstelle innerhalb des zuvor erzeugten Fettdrucks einfügt wird, kommt folgendes heraus:
Vorher: <strong>Dies ist nur ein Test. Es passiert rein gar nichts.</strong> Nachher: <strong>Dies ist nur ein Test. Es </strong><em>passiert</em> <strong>rein gar nichts.</strong>
Der alte Tag wird also aufgebrochen, die neue Formatierung dazwischen eingefügt. Der Benutzer wollte natürlich etwas anderes, nämlich Kursiv- und Fettdruck gleichzeitig.
Wenn jemand eine Lösung für dieses Problem weiÃ, bin ich für jede Hilfe wieder einmal dankbar. Ich habe schon einige meiner Bücher gewälzt, leider ist kein ausgezeichnetes Swing-Buch dabei. Auch für eine Buchempfehlung wär ich dankbar. Swing interessiert mich sehr, natürlich auch die Variante aus dem JDK5.0.
Tags: Java




