HTML-Darstellung in der GUI


Inhalt:





Möglichkeiten mehrzeiligen Text in der GUI zu verarbeiten:


JTextArea

public class JTextArea
extends JTextComponent

JTextArea dient dazu mehrzeiligen ASCII-Text zu erfassen bzw. anzuzeigen. Es ist eine einfache TextKomponente die soweit wie möglich kompatibel zum java.awt.TextArea sein soll.
Im Gegensatz zur awt-Klasse unterstützt sie nicht direkt das Scrollen. Dazu muß man das JTextArea in einem JScrollPane anlegen um diese Eigenschaft zu bekommen.
Verändert hat sich dadurch auch das sogenannte lineWrapping (d.h. Zeilen werden dem sichtbaren Textfeld angepasst oder so gelassen wie sie definiert sind).

Bei JTextArea kann man diese Eigenschaft direkt bestimmen mit:

lineWrap
true lange Zeilen werden dem Anzeigefenster angepasst, d.h. man sieht den ganzen Text
false der Text verschwindet, wenn seine Zeilen laenger sind als das Anzeigefenster
wrapStyleWord
true der Text wird so angepasst, dass Woerter nicht getrennt werden
false der Text wird genau angepasst, keine Ruecksicht wird auf Worttrennung genommen

Insbesondere kann man beim TextArea kein EditorKit setzen.

zurück zum Inhalt



JEditorPane

public class JEditorPane
extends JTextComponent

JEditorPane ist ein mehrzeiliges Feld in dem man verschiedene Arten von Text erfassen und anzeigen kann. Man kann zusätzlich EditorKits verwenden um die Möglichkeiten zur Verarbeitung zu verbessern.
Wie das TextArea muß man das JEditorPane in einem JScrollPane anlegen um das Scrollen zu realisieren. LineWrapping (Zeilenanpassung) wird über das EditorKit gehandhabt.

Je nachdem welches EditorKit gesetzt ist und welche Textart wir haben, wird der Text im JEditorPane unterschiedlich dargestellt.

Wenn wir z.B. ein HTMLEditorKit gesetzt haben und unser Text HTML-formatiert ist, hat JEditorPane die Funktionalität eines Webbrowsers.

Die verschiedenen Textarten, die standardmäßig unterstützt werden sind ASCII-Text, HTML und RTF.

zurück zum Inhalt



JTextPane

public class JTextPane
extends JEditorPane

JTextPane ist ein mehrzeiliges Feld in dem man wie beim EditorPane verschiedene Arten von Text anzeigen kann. Also auch ASCII-Text, HTML und RTF. Zusätzlich kann man es mit graphischen Elementen erweitern. JTextPane unterteilt ein Dokument in verschiedene Kapitel (Paragraphen)

Jedem Kapitel kann man bestimmte Eigenschaften zuordnen (z.B Schriftart, Linienabstände, Blocksatz, etc). Zusätzlich kann man jedem einzelnen Buchstaben bestimmte Attribute übergeben, die sich dann nicht auf das zugehörige Kapitel auswirken.

Wir haben nun nicht nur die Möglichkeit auf verschiedene EditorKits zuzugreifen sondern wir können auch direkt auf das Dokumentenmodell zugreifen. Das Dokumentenmodell ist eine Abbildung des Dokuments welche zur Darstellung verwendet wird.

zurück zum Inhalt



Warum wählen wir TextPane?


zurück zum Inhalt



Wie benutzt man nun den TextPane ?


  1. Erzeugen eines ScrollPanes
  2. Erzeugen eines TextPanes
  3. Erzeugen des EditorKits (bei ASCII Text fällt dieser Punkt weg)
  4. Das EditorKit muß nun dem TextPane mit "setEditorKit" zugeordnet werden (bei ASCII Text fällt dieser Punkt weg)
  5. Eigenschaften des TextPanes setzen, wie editierbar, Hintergrundfarbe, Schriftart, CaretPosition, etc.
  6. Text setzen

Beispiel für ASCII-Text:
	
	// Variablen anlegen
	JPanel contentPane;
  	JScrollPane jScrollPane = new JScrollPane();
  	JTextPane jTextPane = new JTextPane();
  
  	// Eigenschaften dem TextPane zuordnen
	jTextPane.setEditable(true);
	jTextPane.setBackground(Color.red);
	jTextPane.setSelectedTextColor(Color.blue);
	jTextPane.setSelectionColor(Color.white);
	jTextPane.setText("unser Text");
  	
  	// Größe des Scrollpanes bestimmen
  	jScrollPane.setBounds(new Rectangle(40, 30, 150, 50));
  	// JTExtPane dem Scrollpane hinzufügen
  	jScrollPane.getViewport().add(jTextPane, null);
  	  	
  	// ScrollPane dem contentPane hinzufügen
  	contentPane.add(jScrollPane, null);

zurück zum Inhalt



Wie können wir im TextPane HTML darstellen?


  1. Erzeugen eines TextPanes
  2. Erzeugen des HTMLEditorKits
  3. Das HTMLEditorKit muß nun dem TextPane mit "setEditorKit" zugeordnet werden
  4. Beliebigen HTML-formatierten Text dem TextPane übergeben mit "setText"

Beispiel für HTML-Text:
  	
	// Variablen anlegen
	JTextPane jTextPane = new JTextPane();

	// EditorKit erzeugen
	javax.swing.text.html.HTMLEditorKit eKit = new javax.swing.text.html.HTMLEditorKit();
    
	// EditorKit setzen
	jTextPane.setEditorKit(eKit);

	// Text setzen
	jTextPane.setText("<HTML><BODY><b>ein Html-Text</b><br> zum Testen </BODY></HTML>");

zurück zum Inhalt



Was sind EditorKits und welche gibt es?


EditorKits sind eine bestimmte Art von Konverter. Sie können sowohl einen vorgegebenen Text in ein Dokumentenmodell umwandeln, als auch ein Dokumentenmodell in einen Text zurückumwandeln. Je nach EditorKit entstehen dadurch die verschieden Arten von Texten.




DefaultEditorKit

public class DefaultEditorKit
extends EditorKit (abstrakte Klasse)

Eine wichtige Implementation der abstrakten Klasse EditorKit ist die Klasse DefaultEditorKit, die die Bearbeitung von einfachem Text - ohne Formatierungen etc. - unterstützt. Insbesondere erden Text-Aktionen wie copy, cut, insert-newline, paste, tab unterstützt.

Zu beachten: wird automatisch beim Anlegen von EditorPane, TextPane erzeugt und gesetzt

zurück zum Inhalt



StyledEditorKit

public class StyledEditorKit
extends DefaultEditorKit

Das StyledEditorKit stellt Methoden und Eigenschaften für eine bessere Textbearbeitung zur Verfügung. Diese Klasse erweitert insbesondere die Text-Aktionen um Font- und Größen-Informationen, um Stil und Ausrichtung.

zurück zum Inhalt



HTMLEditorKit

public class HTMLEditorKit
extends StyledEditorKit

Das HTMLEditorKit stellt Methoden und Eigenschaften für die Darstellung und Bearbeitung von HTML-Text zur Verfügung. Es wird die HTML-Version 3.2 mit einigen Ausnahmen (keine Frames, keine Applets, etc.) unterstützt.

zurück zum Inhalt



RTFEditorKit

public class RTFEditorKit
extends StyledEditorKit

Das RTFEditorKit ist speziell auf die Darstellung und Bearbeitung von RTF (Rich Text Format) ausgelegt.

zurück zum Inhalt



Dokumente, Modelle, was ist das und wozu?


In Java werden Dokumente immer als ein Modell gesehen. Das bedeutet: das Dokument wird aufgeteilt in Dokumenteigenschaften und in Text. Dadurch kann man z.B. einzelne Zeichen ändern ohne gleich den ganzen Text verändern zu müssen. Man benötigt also ein Dokument um Eigenschaften eines Zeichens zu setzen bzw. zu verändern.

Als zentrales Element dient das Interface Document, auf dem alle anderen Eigenschaften des Dokumentmodells beruhen. Dokumente können angesehen werden als Texte, die aus Elementen bestehen, durch die die Struktur - z.B. logische Abschnitte oder aber speziell formatierter Text - des Dokumentes beschrieben wird.




DefaultStyledDocument

public class DefaultStyledDocument
extends AbstractDocument
implements StyledDocument

Mit JTextPane können wir auf ein StyledDocument zugreifen. DefaultStyledDocument ist eine Implementierung dieses Interfaces.

zurück zum Inhalt



Zusammenspiel Text - EditorKit - Dokumentenmodell


Beispiel setText:

jTextPane.setText("<i>irgendein </i><b>Text</b>");
TextPane
der eingegebene String wird weitergegeben an das:
EditorKit
der String wird in ein Modell umgewandelt, das den Text beinhaltet und alle zugehörigen Informationen
Dokument

zurück zum Inhalt



Beispiel getText:

jTextPane.getText(); 
TextPane 
fragt das EditorKit nach dem Text 
EditorKit 
fragt das Dokument nach dem Text und Zusatzinformationen 
Dokumenthier kann man mit doc.getText(int,int) direkt auf das Dokument zugreifen. Liefert nur den Text, ohne Format.Zeichen!
liefert den Text und die Zusatzinformationen 
EditorKit 
wandelt den Text des Dokuments um in einen Text mit Formatierungszeichen 
TextPane 

zurück zum Inhalt



Beispiele


Arbeiten mit dem Dokument

Wenn wir nur den Text bearbeiten wollen, dann arbeiten wir mit dem Dokument. Denn uns interessiert nicht die Formatierung, sondern der eigentliche Text.
jTextPane.getText() auf HTML-Text liefert HTML-Code, übers Dokument bekommen wir den eigentlichen Text

Beispiel (Finden und markieren eines Strings im Text):
    
void find(String sFind)
{
	int iIndex = -1;
	String sText = "";

	// Dokument erzeugen
	javax.swing.text.DefaultStyledDocument doc = (javax.swing.text.DefaultStyledDocument) jTextPane1.getStyledDocument();

	// Text aus dem Dokument holen
	try
	{
		sText = doc.getText(0,doc.getLength());
	}
	catch(Exception e){}

		
	// Stelle suchen
	iIndex = sText.indexOf(sFind);
        
	// gefundenen String im Text markieren        
	if (iIndex > -1)
	{
		jTextPane1.select(iIndex,iIndex + sFind.length());
	}
}

zurück zum Inhalt



Setzen und Holen von Attributen

Vorgehensweise (Setzen von Attributen):
  1. Erzeugen eines mutableAttributeSet
  2. Setzen der Attribute die man verändern möchte
  3. Dem TextPane diese neuen Attribute zuweisen

Zu beachten:
Wenn man dem TextPane das neue Attribut zuweist, wirkt sich diese Zuweisung entweder nur auf die aktuelle Cursorposition aus, oder, falls eine Markierung im Text vorhanden war, auf diese Markierung.

Beispiel (Setzen eines Attributes auf fett)

	MutableAttributeSet attr = new SimpleAttributeSet();
	StyleConstants.setBold (attr, true);
	jTextPane1.setCharacterAttributes(attr, false);
     
Vorgehensweise (Holen von Attributen):
  1. Holen aller Attribute
  2. Heraussuchen des Attributes welchen einen interessiert
Beispiel (Schriftgröße herausbekommen)
	AttributeSet as = jTextPane.getCharacterAttributes();
	if (as != null)
	{        
		for (java.util.Enumeration e1 = as.getAttributeNames() ; e1.hasMoreElements() ;)
		{
			Object temp = (Object) e1.nextElement();
         
			if (temp.toString().equalsIgnoreCase("font-size") == true)
			{
				System.out.println("Size: --> "+as.getAttribute(temp));
			}
		}
	}
     
     

zurück zum Inhalt



Realisieren eines Hyperlinks

JTextPane hat die Möglichkeit bei einem gesetzten HTMLEditorKit Hyperlinks darzustellen und darauf zu reagieren.
Zu beachten ist hierbei, daß das TextPane auf readonly gesetzt werden muß.

Vorgehensweise
  1. Die Klasse muß zusätzlich HyperlinkListener implementieren.
  2. Im Konstruktor muß hinzugefügt werden: jTextPane1.addHyperlinkListener(this);
  3. TextPane auf readonly setzen mit: jTextPane.setEditable(false);
  4. Implementierung von HyperlinkListener, z.B. mit:
  5. public void hyperlinkUpdate(HyperlinkEvent event)
    {	
    	if (event.getEventType() == HyperlinkEvent.EventType.ACTIVATED)
    	{
    		System.out.println("Die URL lautet: "+event.getDescription());
    	}
    }
    
    

    zurück zum Inhalt