文字と記号を表示するために を使用しています。JTextPane
後者はカスタム ペイントで表されますJComponents
。たとえば、テキスト ペインは次
のように表示されます。テキスト ペインはユーザーが編集可能であり、ユーザーは任意の位置のボタンを使用して、選択したテキストの代わりにシンボルを追加できます。私は
JTextPane.insertComponent()
メソッドを介してこれを行います。アプリケーションのある時点で、テキスト ペインに現在何が表示されているかを知る必要があります。これは、入力されたテキストだけでなく、含まれている正確なコンポーネントも意味します。
Positions
テキスト ペインのコンテンツを管理するために、さまざまなトラブルを経験しましDocumentListeners
たが、解決するよりも多くの問題を引き起こし続けました。そのため、問題はおそらく私の側の設計上の欠陥によるものであると最終的に判断したので、テキストペインからコンポーネントにアクセスできないかどうかを確認することにしました。
AbstractDocument
およびその他の関連クラスのドキュメントとソース コードを検索すると、 interface が見つかりましたjavax.swing.text.Element
。次に、アプリケーションに出力させます
for(int i = 0; i < textPane.getDocument().getLength(); i++) {
System.out.println(((StyledDocument) textPane.getDocument()).getCharacterElement(i));
}
それは私に与えました:
LeafElement(コンテンツ) 0,4
LeafElement(コンテンツ) 0,4
LeafElement(コンテンツ) 0,4
LeafElement(コンテンツ) 0,4
LeafElement(コンポーネント) 4,5
LeafElement(コンテンツ) 5,9
LeafElement(コンテンツ) 5,9
LeafElement(コンテンツ) 5,9
LeafElement(コンテンツ) 5,9
LeafElement(コンポーネント) 9,10
取得しLeafElements
た には、 のどの位置に何が表示されているかについて何らかの情報が含まれているように見えるので、Document
その位置にある実際のコンテンツを取得できるはずだと考えました。各要素が表すコンテンツを取得する方法をさらに 30 分検索した後、私はあきらめて、ここに質問を投稿することにしました。
誰かが を介してコンポーネントにアクセスしようとするこの質問を見たことがtextPane.getComponents()
あります。これは、 に実際に含まれているコンポーネントの正確な数を含むコンポーネントの配列を返しますJTextPane
が、それらはすべて型javax.swing.text.ComponentView$Invalidator
であり、明らかに役に立ちません。シンボルの元のタイプへのキャストが機能しないため、ここから適切に続行する方法がわからないだけかもしれません。
tl;dr
JComponent
のテキスト内にあるJTextPane
とテキスト ペインからの位置を取得するにはどうすればよいですか?