- - PR -
JTextPaneへのコンポーネント追加時の挙動について
1
投稿者 | 投稿内容 | ||||||||
---|---|---|---|---|---|---|---|---|---|
|
投稿日時: 2006-01-29 09:40
自分ではどうも原因が分からないので質問させてください。
現在JTextPaneを用いてエディタを製作しているのですが、その途中insertComponentメソッドを用いてコンポーネントをJTextPaneに追加する際に、通常ならば追加されたコンポーネントがエリア上に表示されるはずですが、他のクラスで生成されたドキュメントをJTextPaneにセットした後にinsertComponentメソッドを用いてコンポーネントの追加を行うと、なぜかコンポーネントがJTextPane上に表示されません(内部では関連付けられているドキュメントに挿入されているようです)。これは何が原因なのでしょうか? この現象を再現するソースを以下に記載します。 ■ファイル名: JTextPaneTest.java
■Javaのバージョン
[ メッセージ編集済み 編集者: えにょ 編集日時 2006-01-30 09:45 ] | ||||||||
|
投稿日時: 2006-01-29 16:27
えにょさん、こんにちは。
まず、このプログラム実行すると例外が出ていますよね。 そして問題が起こるのは、えにょさんのプログラムでは APIドキュメントの insertComponent()に書かれて いる、『複数のテキストコンポーネントでモデルを共用 する場合は、このメソッドを使わないで下さい。』とい う注意書きを守っていないことが原因です。 | ||||||||
|
投稿日時: 2006-01-30 04:37
Kissingerさんレスどうもです。
>>まず、このプログラム実行すると例外が出ていますよね。 私の環境では上記プログラムを実行しても例外が出ないんですが どこで例外が出てるか参考までに教えて頂きたいです。 >>『複数のテキストコンポーネントでモデルを共用 >>する場合は、このメソッドを使わないで下さい。』 APIリファレンスは私も読みましたが、この注意書きには 「コンポーネントは複数のコンテナの子になることはできないため...」 とあるので挿入するコンポーネント自体を複数の場所で 共用してはいけないと認識していました。 私の見当違いなんでしょうか・・・。 | ||||||||
|
投稿日時: 2006-01-31 00:55
えにょさん、お返事が遅くなりました。
例外は、コンポーネントを挿入したあと、自動的に レイアウト変更されるときに発生しております。 ※それ自体が問題なら、ここにスタックトレースを 貼っても良いのですが、根本的な原因を解決する べきなのでとりあえず、省略します。 挿入するコンポーネント自体を複数の場所で共用し てはいけないという認識で正しいです。 えにょさんのプログラムでは、挿入するたびにコン ポーネントを生成してはいますが、JTextPaneTestクラ ス内部で作られた JTextPaneのオブジェクトに挿入し ているつもりが、Otherクラス内で作った JTextPaneの オブジェクトにも挿入しようとしています。 それが、共有してしまっている意味です。 私の説明うまくないので、別の説明をしますと、 Otherの内部の JTextPaneから取り出した Documentは、 その JTextPaneから取り除かれたわけではありません。 そのドキュメントを別の JTextPaneに設定すると、 1個のDocumentが2つのJTextPaneに関係付けられて しまいます。 もし、確認したいなら、Otherの中で作った JTextPane も表示してみれば、挿入したコンポーネントがそち らのほうに表示されているのが確認できますよ。 ※ただし、もう一方の JTextPaneのレイアウト 処理で例外が発生するため、表示は乱れます。 えにょさんのやりたいことを満たすかわかりませんが、 なるべく近い形で、Otherクラスを書きなおしてみました。
参考になればよいのですが。 | ||||||||
|
投稿日時: 2006-01-31 02:27
Kissingerさん、レスありがとうございます。
おかげでこの問題の原因の意味がよく分かりました。 他クラスで生成したJTextPaneとStyledDocumentの関連は消えずに残るんですね・・・。 それとStyledDocumentの生成と編集がJTextPaneでしか行えないものだと 勘違いしていたのでこんな変な書き方をしてしまったのだと思います。 丁寧な説明ありがとうございました。 |
1