Literatur

JEditorPane

Die Klasse JEditorPane ist wie JTextField und JTextArea ebenfalls eine Kindsklasse von JTextComponent. Im Unterschied zu einem JTextArea, das nur einfachen Text darstellen kann (lediglich die Schriftart kann für den gesamten Text gesetzt werden), kann ein JEditorPane formatierten Text darstellen. So können beispielsweise Internetseiten inklusive Bilder angezeigt oder gar Dokumente bearbeitet werden.

Neben dem parameterlosen Standardkonstruktor kennt die Klasse JEditorPane die folgenden Konstruktoren:

Konstruktor Kurzbeschreibung
JEditorPane(String url) In diesem Konstruktor wird URL der Datei, deren Inhalt im JEditorPane angezeigt werden soll, als String übergeben.
JEditorPane(String type, String text) Hier wird für das JEditorPane-Objekt die Formatierung (text/plain, text/html oder text/rtf) und der Text als String angegeben.
JEditorPane(URL initialPage)

Bei diesem Konstruktor wird die Datei, deren Inhalt angezeigt werden soll, in Form eines Objektes der Klasse URL angegeben.

Das JEditorPane bietet zusätzlich zu den von der Elternklasse JTextComponent geerbten Methoden unter anderem die folgenden Methoden:

Methode Kurzbeschreibung
void addHyperlinkListener(HyperlinkListener listener)

Diese Methode fügt der Klasse einen HyperlinkListener hinzu. Der HyperlinkListener muss die Methode hyperlinkUpdate implementieren. Diese Methode wird aufgerufen, wenn ein Link mit dem Mauszeiger überfahren (hier wird zwischen den Ereignissen ENTERED und EXITED unterschieden) oder angeklickt (ACTIVATED) wird.

static EditorKit createEditorKitForContentType(String type) Diese statische Methode liefert das EditorKit für den jeweiligen Texttypen (text/plain, text/html, text/rtf).
String getContentType() Diese Methode liefert den Texttyp des Inhaltes.
EditorKit getEditorKit() Gibt das verwendete EditorKit zurück.
static String getEditorKitClassNameForContentType(String type) Diese statische Methode gibt den Klassennamen des zum angegebenen Texttyp gesetzten EditorKits zurück.
EditorKit getEditorKitForContentType(String type) Diese Methode liefert das zum angegebenen Texttyp gesetzte EditorKit.
HyperlinkListener[] getHyperlinkListeners() Hier werden alle registrierten HyperlinkListener in einem Array zurückgegeben.
URL getPage() Diese Methode liefert die aktuell für das JEditorPane gesetzte URL. Ist die URL ungültig bzw. nicht gesetzt, so wird null zurückgeliefert.
String getText() Gibt den Textinhalt des JEditorPanes zurück.
void read(InputStream in, Object desc) Hier wird das JEditorPane direkt über einen InputStream gefüllt. Als zweiter Parameter kann beispielsweise eine Instanz von HTMLDocument angegeben werden.
static void registerEditorKitForContentType(String type, String classname) Über diese statische Methode kann für einen bestimmten Texttyp eine EditorKit-Klasse vorgegeben werden.
void removeHyperlinkListener(HyperlinkListener listener) Angegebener HyperlinkListener wird entfernt.
void replaceSelection(String content) Über diese Methode wird ein markierter Text mit dem angegebenen Inhalt überschrieben.
void setContentType(String type) Setzt den Texttyp. Über getEditorKitForContentType ermittelt diese Methode automatisch das dazu passende EditorKit und setzt diesen für das JEditorPane.
void setEditorKit(EditorKit kit) Diese Methode entfernt alte EditorKit-Instanzen und setzt dann für das JEditorPane das angegebene EditorKit, sofern es nicht null ist. Wichtig zu wissen ist, dass dies dazu führt, dass ein neues Standarddokument angelegt wird, was bedeutet, dass der zuvor angezeigte Inhalt entfernt wird.
void setEditorKitForContentType(String type, EditorKit k) Über diese Methode wird für den angegebenen Texttyp ein EditorKit-Objekt vorgegeben.
void setPage(String url) Gibt die URL an, die im JEditorPane angezeigt werden soll.
void setPage(URL page) Wie oben, mit dem Unterschied, dass die URL als Objekt der Klasse URL und nicht als String angegeben wird.
void setText(String t) Setzt den Text, der im JEditorPane angezeigt werden soll.

Eine vollständige Auflistung aller Methoden entnehmen Sie bitte der API.

Für ein JEditorPane kann über den Konstruktor oder die Methode setContentType(String type) das Textformat vorgegeben werden. Standardmäßig stehen dabei die folgenden Formate zur Verfügung:

  • text/plain: einfacher Text (Standardeinstellung, falls keine andere Formatierung erkannt wird)
  • text/html: Text im HTML-Format
  • text/rtf: Text im RTF-Format

Für den Umgang mit dem Text (Einlesen, Darstellung usw.) ist die Klasse EditorKit bzw. eine ihrer Unterklassen zuständig. Dies ist auch bei den "einfachen"  Textkomponenten wie JTextArea und JTextField der Fall, nur dass er dort im Gegensatz zum JEditorPane verborgen bleibt.

Für das JEditorPane kann das EditorKit über die Methode setEditorKit(EditorKit kit) angegeben werden. Es gibt spezielle vorgefertigte EditorKits für die oben genannten Textformate, die allesamt Unterklassen von EditorKit sind, wie aus diesem Klassendiagramm ersichtlicht wird:

Klassendiagramm der abstrakten Klasse EditorKit und dessen Subklassen

Das DefaultEditorKit ist die einzige direkte Kindsklasse von EditorKit und daher die Oberklasse aller anderen EditorKits. Das DefaultEditorKit wird standardmäßig verwendet, wenn kein passenderes EditorKit gefunden bzw. gesetzt wird. Es bietet Actions für einfache Funktionalitäten wie Ausschneiden, Kopieren und Einfügen.

Die Klasse StyledEditorKit bietet die Funktionalitäten für einfache formatierte Texte, wie man sie aus einem einfachen Textbearbeitungsprogramm kennt. Es unterstützt u. a.  Fett- und Kursivschrift, verschiedene Schrifttypen und unterschiedliche Schriftgrößen.

Das HTMLEditorKit unterstützt Dokumente, die auf HTML (Hyper Text Markup Language) basieren. Aktuell wird allerdings nur der HTML-Standard 3.2, und auch dieser nur mit zusätzlichen Erweiterungen des EditorKits, vollständig untersützt. Es werden aber auch HTML-Dokumente höherer Versionen angezeigt, jedoch sollte man hierbei berücksichtigen, dass der HTML-Code möglicherweise nicht korrekt interpretiert wird.

Die Klasse RTFEditorKit unterstützt die Anzeige und das Bearbeiten von RTF (Rich Text Format) Dokumenten.

Falls Sie eigene Formatierungsregeln anwenden bzw. ein anderes Format umsetzen möchten, können Sie aber auch eine eigene von EditorKit abgeleitete Klasse programmieren bzw. eine bestehende erweitern und eine Instanz dieser Klasse für Ihr JEditorPane setzen. In dem Fall müsste man sich intensiver mit dem Aufbau und der Funktionsweise der EditorKits auseinandersetzen, was den Rahmen unseres Tutorials sprengen würde. Wenn Sie sich die Arbeit nicht selber machen möchten, empfiehlt es sich, im Internet zu suchen, ob es bereits fertige EditorKits für Ihre Zwecke gibt, die andere Programmierer zur Verfügung gestellt haben und Sie für Ihr Projekt nutzen können.

Nachfolgend finden Sie nun ein Beispiel  für ein JEditorPane, in dem eine HTML-Seite angezeigt wird:

 
import java.io.IOException;
import javax.swing.*;
 
public class JEditorPaneBeispiel {
 
    public static void main(String[] args) {
        JFrame frame = new JFrame("JEditorPaneBeispiel");
 
        // Neuer JEditorPane wird erzeugt.
        JEditorPane editorPane = new JEditorPane();
 
        // Anzuzeigende URL wird gesetzt.
        // Da setPage eine IOException wirft, muss
        // der Aufruf im try-catch-Block erfolgen.
        try {
            editorPane.setPage("http://www.java.com");
        } 
        catch (IOException ioe) {
            // HTML wird als Texttyp vorgegeben.
            editorPane.setContentType("text/html");
 
            // Text für Fehlermeldung wird
            // im HTML-Format übergeben.
            editorPane.setText("<html> <center>"
                    + "<h1>Page not found</h1>"
                    + "</center> </html>.");
        }
 
        // Inhalt kann so nicht editiert werden.
        editorPane.setEditable(false);
 
        JScrollPane scrollPane = new JScrollPane(editorPane);
        frame.add(scrollPane);
 
        frame.setSize(800, 600);
        frame.setVisible(true);
    }
}

URL wird in JEditorPane aufgerufen

Wir setzen für das JEditorPane mit der Methode setPage die URL "http://www.java.com". Die entsprechende Webseite wird im JEditorPane angezeigt. Da setPage eine IOException wirft, muss der Aufruf im try-catch-Block erfolgen. 

Für eine HTML-Seite verwendet der JEditorPane standardmäßig als EditorKit eine Instanz der Klasse HTMLEditorKit, was Sie daran sehen, dass sie wie in einem Browser dargestellt wird. Aber wie schon weiter oben erwähnt, hat die HTML-Unterstützung seine Grenzen, wie sie hier gut sehen können. Rufen Sie die Seite mit einem gängigen Webbrowser auf, dann werden Sie im Vergleich feststellen, dass im JEditorPane nicht alles korrekt dargestellt wird.

Gut geeignet ist diese Funktionalität aber zum Beispiel für die Anzeige von selbsterstellten Seiten im HTML- und RTF-Format, beispielsweise um eine Dokumentation in die Software zu integrieren.

Falls die URL nicht erreichbar ist (Sie können dies selber testen, indem sie einfach mal eine ungültige URL angeben), wird der catch-Block ausgeführt. Dort setzen wir zunächst den Texttyp auf HTML. Anschließend setzen wir mit setText die Fehlermeldung im HTML-Format.

Damit die Seite sich scrollen lässt, wird das JEditorPane auf einem JScrollPane angeordnet.

Sie können auch einen eigenen Browser mit dem JEditorPane realisieren. Damit Ihr JEditorPane beim Anklicken von Hyperlinks die entsprechende Seite öffnet, muss dazu ein HyperlinkListener implementiert werden, der auf das Anklicken von Links entsprechend reagiert.  Mehr zum Thema Event-Handling und EventListener erfahren Sie hier.


Unterthemen: