2009-03-13 12 views
4

Ich habe eine Liste von Objekten (das Modell), an die ständig angehängt wird (ähnlich einer Protokolldatei) und die ich als Rich Text in einem JEditorPane (der Ansicht) anzeigen möchte. Wie kann ich sie zusammenkleben?Java Swing benutzerdefinierter Text JEditorPane

http://java.sun.com/docs/books/tutorial/uiswing/components/generaltext.html#document scheint nicht genug Informationen zu verwenden.

+0

Welche Klasse (n) werden als Objekte (Modell) verwendet? – ksuralta

+0

Ich habe einen Vektor von proprietären Objekten - jeder enthält einen String und andere Informationen. Im Idealfall würde eine Art benutzerdefinierter Renderer den Textbereich formatieren und anhängen, aber ich kann nicht herausfinden, wie man ihn zusammenhält. – Pool

Antwort

2

können Sie DefaultStyledDocument verwenden zusammen mit AttributeSet:

SimpleAttributeSet attr = new SimpleAttributeSet(); 
StyleConstants.setBold(attr , true); 
StyleConstants.setForeground(attr, Color.RED); 
document.insertString(document.getLenght(),"yourstring", attr)) 
2

Eine einfache Lösung wäre, jedes Objekt im Modell in HTML umzuwandeln und die Zeichenfolgen anzuhängen, um ein HTML-Dokument zu erstellen, das auf dem JEditorPane gesetzt werden kann.

+0

Ja, das wäre die einfachste Lösung, aber ich wollte die Daten neu rendern, wenn ein Benutzer sein Farbschema ändern oder die Daten filtern wollte. Ich schätze, dass die ganzen Daten nach jedem Event neu angehängt werden könnten. – Pool

+0

Wenn das der Fall ist, denke ich, dass Sie besser eine JTable verwenden könnten. Es wäre einfacher, ein TableModel für Ihre Objekte zu erstellen, als ein Dokument zu erstellen. Sie könnten dann Filter auf Ihr Tabellenmodell anwenden und die Einstellungen für den Tabellenneaser für Farbe usw. ändern. – Mark

0

Erstellen einer benutzerdefinierten Abstract Document ist schmerzhaft. Sie sind besser mit einem intermediären Modell, das Änderungen sowohl in Ihrem Object Modell und dem Dokument (mit einem DocumentListener) hört und aktualisiert entweder das Modell oder die Ansicht, abhängig. Dies funktioniert sehr gut, wenn Sie in der Benutzerzeit arbeiten (im Gegensatz zum Aktualisieren des Object Modells 1.000 Mal pro Sekunde).

+0

Die Art, wie ich es verstehe - Modelle für Editorfenster müssen Dokumente sein. Wenn Sie das Dokument nicht implementieren, wie kann Ihr benutzerdefiniertes Modell hinzugefügt werden? – Pool

+0

Ich wollte eines der Standard StyleDocuments verwenden und nur Text und Attribute manipulieren. –

0

OK, so war der einfachste Ansatz JTextPane zu verlängern. Die erweiterte Klasse erstellt und verwaltet die zugrunde liegende Liste. Bei Formatwechsel (zB neue Farben) formatiert die Liste die Daten komplett neu. Das einzige wirkliche Problem war, dass die Auto-Scrolling nicht 100% zuverlässig ist, Both:

Container parent = getParent(); 

// get the parent until scroll pane is found 
while (parent != null && !(parent instanceof JScrollPane)) { 
    parent = parent.getParent(); 
} 

if (parent != null) { 
    JScrollPane scrollPane = (JScrollPane)parent; 
    scrollPane.getVerticalScrollBar().setValue(scrollPane.getVerticalScrollBar().getMaximum()); 
} 

und

scrollRectToVisible(new Rectangle(0, getHeight() - 2, 1, 1)); 

inkonsistente Ergebnisse mit dem Textbereich Geben Sie manchmal nicht den ganzen Weg zu scrollen.