Ausgabe auf JEditorPane

Status
Nicht offen für weitere Antworten.

XFlipX

Aktives Mitglied
Hallo,

ich bin soweit, dass ich einen externen Player starten und dessen Stausmeldungen mir in der Konsole anzeigen lassen kann. Jetzt möchte ich aber die Statusmeldungen auf meine JEditorPane ausgeben. Was die Statusmeldungen angeht, die liegen alle in einem BufferedReader. Den ich normalerweise Zeile für Zeile auslese und auf der Konsole ausgebe.

Mit der Methode setText würde ich ja immer wieder komplett den Text der EditorPane neu setzen, sodass ich immer nur die letzte Zeile sehen würde.

Gibt es hier andere Möglichkeiten ?

Danke, XFlipX
 
Wenn du eine JTextArea verwenden würdest, könntest du mit apped(String) am Ende des Textes weiteren Text anfügen. Vielleicht ist das ja eine Alternative zur JEditorPane.
 
oder halt einfach
editor.setText(editor.getText()+neuerText);

oder den text in einem stringbuffer/builder halten. (da gibt es auch das append()),
und dann kannst du einfach editor.setText(buffer.toString()); o.ä. setzen
 
Die Swing-Komponenten sind eigentlich alle zu langsam, um sie venünftig als Konsole einzusetzen.
Am ehesten geht es noch mit einer JTextArea in dieser Art:

Java:
	private JTextArea console = null;
	
	...
	
	console = new JTextArea();
	console.setEditable(false);
	Font f = new Font("Monospaced", Font.PLAIN, 12 );
	console.setFont(f);

	...

	/**
	 * Print string to console window
	 * @param s String to print
	 */
	public void print(final String s) {
		Document doc = console.getDocument();
		int length = doc.getLength();
		try {
			doc.insertString(length, s, null);
		} catch (BadLocationException ex) {}
	}
	
	/**
	 * Force console to display last line
	 */
	public void flush() {
		SwingUtilities.invokeLater(new Runnable() { public void run() { console.setCaretPosition(console.getDocument().getLength()); } });
	}

	/**
	 * Print text to output pane
	 * @param s text to print
	 */
	public void printOut(final String s) {
			SwingUtilities.invokeLater(new Runnable() { public void run() { print(s); } });
	}

Ein JEditorPane, das man für farbigen Text bräuchte, ist dramatisch viel langsamer. So oder so hat man früher oder später das Problem, daß irgendwann das Einfügen neuen Texts so lange dauert, daß neue Ausgabeanweisungen nicht mehr ausgegeben werden und schlimmstenfalls die gesamte Swing-Eventqueue hängenbleibt.
Es gibt diverse Notlösungen wie das zyklische Löschen des gesamten Inhalts oder das Löschen einer Zeile am Anfang für das Einfügen einer Zeile am Ende, sobald eine bestimmte Maximalanzahl an Zeilen überschritten wurde. Aber eine richtig saubere Lösung gibt es nicht.
Aus welchem Grund auch immer stellt Swing keine Dokumentenklasse usw. zur Verfügung, die man für eine vernünftige Konsolenimplementierung bräuchte und die paar wenigen Ansätze in dieser Richtung sind lediglich minimal optimierte Versionen von JEditorPane, die nicht wirklich viel bringen und ebenfalls viel langsamer sind als eine JTextArea.
Ich habe schon mehrfach angesetzt, mir selber sowas zu schreiben, aber letztendlich habe ich mich auch immer mit einem Provisorium wie dem obigen abgefunden.
 
Hi,

über das beinhaltende Document des JEditorPane kann man Texte anhängen - aber auch an beliebiger Stelle einfügen. Vielleicht hilft das hier ja:

(JEditorPane ist initialisiert und Attribut der Klasse, welche die Methode append() bietet)

Java:
public void append(String text)
      {
      Document doc = pane.getDocument();
      
      try
         {
         doc.insertString(doc.getLength(), text, null);
         }
      catch (BadLocationException e)
         {
         e.printStackTrace();
         }
      }

Das erste Attribut von insertString() gibt die Stelle an, wo eingefügt werden soll (durch doc.getLength() am Schluß). Über das letzte Attribut können Formatierungsattribute gesetzt werden.
 
Wie gesagt: JEditorPane ist als Konsole weitestgehend unbrauchbar, weil dies Komponente von der Geschwindigkeit her maximal mit der Eingabegeschwindigkeit eines Menschen klarkommt. Wenn man nur alle paar Sekunden eine Zeile ausgeben muß, geht das eine Weile gut. Wenn es auch mal ein paar hundert Zeilen in ein paar Sekunden sein sollen, endet das im totalen Stillstand.
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben