Eine Komponente aus einem JTextPane über javax.swing.text.Element abrufen?
Ich benutze eineJTextPane
um Zeichen und Symbole anzuzeigen, wobei letztere durch benutzerdefinierte Bemalung dargestellt werdenJComponents
. Das Textfenster könnte beispielsweise Folgendes anzeigen: Das Textfenster kann vom Benutzer bearbeitet werden. Der Benutzer kann über eine Schaltfläche an einer beliebigen Position weitere Symbole hinzufügen und den ausgewählten Text ersetzen. Ich mache das über dieJTextPane.insertComponent()
Methode. Irgendwann in der Anwendung muss ich wissen, was aktuell im Textbereich angezeigt wird, und damit meine ich nicht nur den eingegebenen Text, sondern auch die genauen darin enthaltenen Komponenten.
Ich habe mit viel zu tun gehabtPositions
undDocumentListeners
um den Inhalt meines Textfensters zu verwalten, aber ich verursachte immer mehr Probleme als ich löste. Aus diesem Grund habe ich mich letztendlich entschieden, dass meine Probleme wahrscheinlich auf einen Konstruktionsfehler zurückzuführen sind. Deshalb habe ich mich entschlossen, zu prüfen, ob ich nicht über das Textfenster zu meinen Komponenten komme.
Durchsuchen der Dokumentation und des Quellcodes vonAbstractDocument
und andere verwandte Klassen fand ich die Schnittstellejavax.swing.text.Element
. Ich lasse dann meine Bewerbung ausgeben
for(int i = 0; i < textPane.getDocument().getLength(); i++) {
System.out.println(((StyledDocument) textPane.getDocument()).getCharacterElement(i));
}
was gab mir:
LeafElement (Inhalt) 0,4
LeafElement (Inhalt) 0,4
LeafElement (Inhalt) 0,4
LeafElement (Inhalt) 0,4
LeafElement (Komponente) 4,5
LeafElement (Inhalt) 5,9
LeafElement (Inhalt) 5,9
LeafElement (Inhalt) 5,9
LeafElement (Inhalt) 5,9
LeafElement (Komponente) 9,10
Zu sehen, dass dieLeafElements
Ich habe anscheinend Informationen darüber, was an welcher Position im Fenster angezeigt wirdDocument
Ich stellte mir vor, dass es möglich sein muss, den tatsächlichen Inhalt an dieser Position abzurufen. Nachdem ich eine weitere halbe Stunde lang nach dem Inhalt der einzelnen Elemente gesucht hatte, gab ich es auf und entschloss mich, meine Frage hier zu posten, in der Hoffnung, dass einige von Ihnen vielleicht wissen, wie man das erreicht !?
Ich habe das gesehenFrage wo jemand versucht, auf die Komponenten zuzugreifentextPane.getComponents()
, der ein Array von Komponenten mit der genauen Anzahl der tatsächlich in der Datei enthaltenen Komponenten zurückgibtJTextPane
, aber sie sind alle vom Typjavax.swing.text.ComponentView$Invalidator
, was mir natürlich nichts nützt. Vielleicht verstehe ich einfach nicht, wie ich von hier aus richtig weitermachen kann, weil eine Umwandlung in den ursprünglichen Typ meines Symbols nicht funktioniert.
tl; dr
Wie bekomme ich eine?JComponent
, der im Text von aJTextPane
und seine Position aus dem Textfenster?