Obter um componente de um JTextPane através de javax.swing.text.Element?
Estou usando umJTextPane
para exibir caracteres e símbolos, onde os últimos são representados por cores personalizadasJComponents
. Por exemplo, o painel de texto pode mostrar algo assim: O painel de texto é editável pelo usuário e é permitido ao usuário adicionar mais símbolos por meio de um botão em qualquer posição e como substituto do texto selecionado. Eu faço isso através doJTextPane.insertComponent()
método. Em algum ponto do aplicativo, preciso saber o que está sendo exibido no painel de texto, e com isso quero dizer não apenas o texto digitado, mas também os componentes exatos contidos nele.
Eu passei por extensos problemas comPositions
eDocumentListeners
para gerenciar o conteúdo do meu painel de texto, mas continuei causando mais problemas do que estava resolvendo. É por isso que finalmente decidi que meus problemas provavelmente se devem a uma falha de design da minha parte, então decidi ver se não posso acessar meus componentes através do painel de texto.
Pesquisando através da documentação e do código fonte doAbstractDocument
e outras classes relacionadas, encontrei a interfacejavax.swing.text.Element
. Então deixo a saída da minha aplicação
for(int i = 0; i < textPane.getDocument().getLength(); i++) {
System.out.println(((StyledDocument) textPane.getDocument()).getCharacterElement(i));
}
o que me deu:
LeafElement (conteúdo) 0,4
LeafElement (conteúdo) 0,4
LeafElement (conteúdo) 0,4
LeafElement (conteúdo) 0,4
LeafElement (componente) 4,5
LeafElement (conteúdo) 5,9
LeafElement (conteúdo) 5,9
LeafElement (conteúdo) 5,9
LeafElement (conteúdo) 5,9
LeafElement (componente) 9,10
Vendo que oLeafElements
que eu tenho parecem ter algum tipo de informação sobre o que é exibido em qual posição noDocument
, Imaginei que deve ser possível obter o conteúdo real nessa posição. Depois de procurar por mais meia hora como obter o conteúdo de cada um dos elementos, desisti e decidi postar minha pergunta aqui, esperando que alguns de vocês soubessem como fazer isso!
Eu vi issoquestão onde alguém tenta acessar os componentes através detextPane.getComponents()
, que retorna uma matriz de componentes com o número exato de componentes realmente contidos noJTextPane
, mas eles são todos do tipojavax.swing.text.ComponentView$Invalidator
que obviamente não tem utilidade para mim. Talvez eu simplesmente não veja como continuar apropriadamente daqui, porque um elenco para o tipo original do meu símbolo não funciona.
tl; dr
Como obtenho umJComponent
, que está dentro do texto de umJTextPane
e sua posição do painel de texto?