- ベストアンサー
ツリーのあるノードだけ選択できないようにしたい
こんばんは。 ツリー表示において特定のノード(具体的には子ノードを持っていないノード)のみ選択できないようにしたいと考えていますが、やり方がいまいちわかりません。 DefaultTreeModelを使ってどうにかできるのでしょうか? 宜しくお願いします。
- みんなの回答 (2)
- 専門家の回答
質問者が選んだベストアンサー
- ベストアンサー
ざっと見てみたんですが・・。#1の方のいうようにTreeCellRendererを使う形になりそうですね。 TreeCellRendererを継承して独自のTreeCellRendererを用意します。そのクラス内にgetTreeCellRendererComponentというメソッドを定義します(詳細はJavaDoc等で確認ください)。このメソッドは、セルに表示させるJLabel継承クラスのコンポーネントを作成しreturnするもので、ここで返したComponentが、そのまま各TreeNodeの表示として使われるわけです。 このメソッドの引数には、そのTreeNodeがleafか否かを示すbooleanが用意されています。この値をもとに、返すComponentのsetEnabledを変更すれば良いでしょう。 class ○○ extends DefaultTreeCellRenderer { public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { this.setEnabled(leaf); // leafの値をenabledに設定 // 他、表示するLabelの設定を記述していく return this; } } 例えば、こんな感じでしょう。表示するTreeNodeはvalueで渡されますから、それをもとに必要な値を調べて表示を設定すれば良いでしょう。 ただし、leafか否かならばこれだけでできますが、それぞれのTreeNodeごとにenabledの状態を持たせたいとしたら、TreeNodeを拡張するしかないように思います。例えばDefaultTreeNodeだと、isEnableやsetEnableといった利用可能に関するプロパティは持っていないようですから。 なので、この場合は、TreeNodeとTreeCellRendarerの両方を用意する必要がありそうですね。
その他の回答 (1)
- Bonjin
- ベストアンサー率43% (418/971)
試してはいないですが TreeCellRendererとかでできませんかねぇ・・・?
お礼
なるほど、TreeCellRendererでやればうまくできそうです。leafか否かだけでなので大丈夫です。助かりました!