• ベストアンサー

ツリーのあるノードだけ選択できないようにしたい

こんばんは。 ツリー表示において特定のノード(具体的には子ノードを持っていないノード)のみ選択できないようにしたいと考えていますが、やり方がいまいちわかりません。 DefaultTreeModelを使ってどうにかできるのでしょうか? 宜しくお願いします。

質問者が選んだベストアンサー

  • ベストアンサー
noname#49664
noname#49664
回答No.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の両方を用意する必要がありそうですね。

参考URL:
http://java.sun.com/j2se/1.4/ja/docs/ja/api/javax/swing/tree/DefaultTreeCellRenderer.html
mikimiki777
質問者

お礼

なるほど、TreeCellRendererでやればうまくできそうです。leafか否かだけでなので大丈夫です。助かりました!

全文を見る
すると、全ての回答が全文表示されます。

その他の回答 (1)

  • Bonjin
  • ベストアンサー率43% (418/971)
回答No.1

試してはいないですが TreeCellRendererとかでできませんかねぇ・・・?

全文を見る
すると、全ての回答が全文表示されます。

関連するQ&A

  • C#のツリービューでツリーノードとデータの関連付け

    こんにちは。 C#でツリービューの操作をしています。 すでに階層構造を持つデータがあります。これをツリービューに表示させようとしています。 TreeNode treeNodeFruits = new TreeNode("果物"); としてツリービューに追加してあげると普通に表示できますが、このままだと独自データと関連付けがされていないため、ノードをクリックした際に何もできません。 C++ではHTREEITEMのlParamにユーザーデータのポインタをセットできますが、C#ではツリーノードに関連付けできそうな項目が見当たりません。 C#ではツリーノードと独自に持つデータとの関連付けをどのようにすればよろしいのでしょうか?

  • ツリービューのノードを閉じた時のイベント

    VB6でツリービューを利用したプログラムを組んでいます。ツリービューのイベント処理において、ツリービューのノードを展開した時には、Expandイベントで取得することが可能だと思うのですが、ノードを閉じたときのイベントは、取得することができるのでしょうか?

  • ツリービューのノードをダブルクリックしたことを判断させるには

     VBにて、ツリービューのノードをダブルクリックしたときにこうする、というような処理をさせるにはそうすればいいんでしょうか。  TreeView1_NodeClickというのはありますが、ダブルクリックに関してはDblClickだけしか存在せず、どのノードを選択したかを取得できません。  どなたか、TreeView1_NodeClickのようにノードをダブルクリックした時に限り、そのノードを取得して処理をさせるというような方法を教えてください。  よろしくお願いします。

  • VB2005 TreeViewの任意ノード選択

    お世話になっております。 VB2005でWinアプリを開発中です。 ルートノードは1つで、 そこから子、孫、ひ孫・・・と階段状になるTreeViewを作っています。 親   L子      L孫         Lひ孫             ・・・・ このようなツリーに対し、プログラムで任意のノードを選択状態にしたいのですが、 ノードの名称などで一発で指定する方法はありますでしょうか?? 上の例で、「孫」を選択状態にしたい場合、 TreeView1.SelectedNode = TreeView1.Nodes(0).Nodes(0).Nodes(0) と書けば、できることはできるのですが。 他にもっとよい方法があるはずと思うのですが、見つけられませんでした。 VB6.0なら、下記に方法があったのですが・・・ http://oshiete1.goo.ne.jp/qa732490.html よろしくお願いします。

  • VB6.0ツリービューについて

    現在、VB6.0で開発をしております。 その中で、ツリービューを使用しています。 で、ツリービューのノードを設定してある状態で、ユーザがクリックしてノードのひとつを選択するのではなく、プログラムからあるひとつのノードを選択状態にするにはどうすればよいでしょうか? ご教授いただけますでしょうか。よろしくお願いします。

  • ツリービューで、画像管理したいのですが・・・・

    ツリービューで、画像や、テキストをを管理したいのですが、 ツリービューのノードに画像や、テキストを入れることが出来るのでしょうか? ツリービューのノードをクリックして選択した場合、 ピクチャーボックスやテキストボックスに、画像やテキストを表示したいのですが、 どうすればいいのか教えて下さい・・・お願いします。

  • ツリービューについて

    いつも参考にしています。 今回初めてVBで開発することになりました。 ツリービューの部分で詰ってしまいました。 【内容1】 2階層のツリーで下位階層(子)が選択されているときだけ実行したい処理があります。 現在選択しているノードが上位階層(親)か下位階層(子)か判断できるような関数などあるのでしょうか? 【内容2】 現在、画面上のツリービュー表示項目をダブルクリックすると値を更新できてしまうのですが、更新不可にできないでしょうか? どちらも初歩的なことなのかも知れませんが、検索しても分からなかったんです。 どうぞアドバイスお願いします。 VBは6.0です。

  • (VB.NET)TreeViewのノード文字列の表示

    いつも参考にさせていただいております。 現在VB.NETにて開発をしております。 レベルの低い質問なのかもしれないのですが、 ツリービューのノード表示で困っています。 DBから文字列データをいくつか取得し、それを ツリービューに表示させるプログラムをつくっています。取得した文字列は半角全角が入り混じっています。子ノードをいくつかの文字列でつないでひとつの 子ノードを作りたいのです。それぞれの子ノードに 入る文字列と文字列の間には空白をいれ、二つ目に入る 文字列の位置を子ノード同士そろえたいのですがどうもうまくいきません。 (例) 八百屋・・・・・・にんじん(空白)はくさい ←子ノード1     ・     ・・・大根(空白)トマト   ←子ノード2  上記場合だと、はくさいとトマトの文字列が始まる位置をそれぞれのノード同士、同じ位置からスタートさせたいのです。 (例2) 八百屋・・・・・・にんじん(空白)はくさい ←子ノード1     ・     ・・・大根( 空白 )トマト  ←子ノード2  上記例2のようにしたいのですが可能でしょうか? わかりづらくて申し訳ありません。 よろしくお願いします。

  • あるノードリストに、特定の名前のノードが存在するかどうか調べたい

    ある MSXML2.IXMLDOMNodeList に、特定の名前のノードが存在するかどうか調べたいのですが、 どのようにすればよいでしょうか。 全てのノードを調査すれば私の知識でもできないことはないのですが、 便利なメソッド等はないかと思いまして。。。 (「haschildnodes」って、「特定の」子ノードの存在は調べられませんよね・・・?) なお、VB.NETでコーディングしています。 ご回答よろしくお願いします。

    • 締切済み
    • XML
  • C# ツリービューの使い方

    現在、Microsoft Visual C# 2008 Express Editionでプログラムを作成しているのですが、ツリービューの使い方がよくわかりません。 具体的には、ツリービューとリストビューを左右に並べて、ツリービューのノードをクリックしたときに、その子ノードをリストビューに表示したいと考えています。 そこで、 ツリービューのNodeMouseClickイベントで foreach ( TreeNode child in this.treeView1.SelectedNode.ChildNodes ) { //リストにノードを表示する } と記述したのですが、 「'System.Windows.Forms.TreeNode' に 'ChildNodes' の定義が含まれておらず、型 'System.Windows.Forms.TreeNode' の最初の引数を受け付ける拡張メソッドが見つかりませんでした。using ディレクティブまたはアセンブリ参照が不足しています。」 というエラーが発生しました。 これを解決するにはどうすればいいのでしょうか?また、私が実装しようと考えている機能を、ツリービューとリストビューを併用した方法以外でより効率的にかけたりしますか? C#に詳しい人、回答よろしくお願いします。