Pobierz komponent z JTextPane poprzez javax.swing.text.Element?

UżywamJTextPane do wyświetlania znaków i symboli, gdzie te ostatnie są reprezentowane przez malowane na zamówienieJComponents. Na przykład panel tekstowy może pokazywać coś takiego: Panel tekstowy może być edytowany przez użytkownika i użytkownik może dodawać kolejne symbole za pomocą przycisku w dowolnej pozycji i zastępować wybrany tekst. Robię to przezJTextPane.insertComponent() metoda. W pewnym momencie w aplikacji muszę wiedzieć, co jest aktualnie wyświetlane w okienku tekstowym, a przez to mam na myśli nie tylko wprowadzony tekst, ale także dokładnie zawarte w nim składniki.

Przeżyłem rozległe problemy zPositions iDocumentListeners zarządzać zawartością mojego okienka tekstowego, ale powodowałem więcej problemów niż rozwiązywałem. Dlatego w końcu zdecydowałem, że moje problemy są prawdopodobnie spowodowane błędem projektowym z mojej strony, więc postanowiłem sprawdzić, czy nie mogę dostać się do moich komponentów przez okienko tekstowe.

Przeszukiwanie dokumentacji i kodu źródłowegoAbstractDocument i inne powiązane klasy, znalazłem interfejsjavax.swing.text.Element. Następnie wypuszczam moją aplikację

for(int i = 0; i < textPane.getDocument().getLength(); i++) {
    System.out.println(((StyledDocument) textPane.getDocument()).getCharacterElement(i));
}

co dało mi:

LeafElement (treść) 0,4

LeafElement (treść) 0,4

LeafElement (treść) 0,4

LeafElement (treść) 0,4

LeafElement (komponent) 4,5

LeafElement (treść) 5,9

LeafElement (treść) 5,9

LeafElement (treść) 5,9

LeafElement (treść) 5,9

LeafElement (komponent) 9,10

Widząc, żeLeafElements wydaje mi się, że mam jakieś informacje o tym, co jest wyświetlane w danej pozycjiDocument, Pomyślałem, że musi istnieć możliwość uzyskania rzeczywistej zawartości na tej pozycji. Po przeszukiwaniu kolejnych pół godziny, jak zdobyć zawartość każdego z elementów, poddałem się i postanowiłem opublikować moje pytanie tutaj, mając nadzieję, że niektórzy z was mogą wiedzieć, jak to osiągnąć !?

Widziałem topytanie gdzie ktoś próbuje uzyskać dostęp do komponentówtextPane.getComponents(), która zwraca tablicę komponentów z dokładną liczbą komponentów faktycznie zawartych wJTextPane, ale wszystkie są tego typujavax.swing.text.ComponentView$Invalidator, co jest dla mnie bezużyteczne. Może po prostu nie widzę, jak poprawnie kontynuować stąd, ponieważ rzut na oryginalny typ mojego symbolu nie działa.

tl; dr

Jak uzyskaćJComponent, który znajduje się w tekście aJTextPanei jego położenie z okienka tekstowego?

questionAnswers(2)

yourAnswerToTheQuestion