- 締切済み
JTreeのTreeCellRendererについて
JTreeでノードのレンダラを自前で実装して、ノードにチェックボックスを つけようとしています。 チェックボックス(JCheckBox)付きのノードを表示させることはできたのですが、 その表示したチェックボックスをマウスで操作しても何の反応もありません(クリックしてもチェックマークのオン・オフが切り替わらない)。 試しにJButtonを表示させてみたのですが、こちらもボタンは表示されるのですが押すことができませんでした。 自前のセルレンダラで表示させるコンポーネントを操作する方法を教えてください。 以下、セルレンダラのコードです。このクラスをJTree#setCellRendererで登録しています。 public class MyCellRenderer extends JPanel implements TreeCellRenderer { private JCheckBox check; public MyCellRenderer(){ check = new JCheckBox(); add(check); } public Component getTreeCellRendererComponent(JTree arg0, Object arg1, boolean arg2, boolean arg3, boolean arg4, int arg5, boolean arg6) { TreeNode node = (TreeNode)arg1; check.setText(node.toString()); return this; } }
- みんなの回答 (1)
- 専門家の回答
みんなの回答
- _ranco_
- ベストアンサー率58% (126/214)
ノードに、表示だけでなくコンポーネントとしての機能が欲しいときは、セルレンダラと共にセルエディタも必要です。JTreeのドキュメンテーションをよく読んでください。
お礼
回答ありがとうございます。 セルレンダラと共にセルエディタというものも必要なのですね。 調べながら実装してみます。うまくいかなかったらまた質問させてください。
補足
セルレンダラ→表示させるためのもの セルエディタ→エディタの機能を持たせるためのもの というのはわかりました。 質問時のコードのクラスにTreeCellEditorを実装して、getTreeCellEditorComponentで操作できるチェックボックスを初期表示できるようになりました。 ノード自体にbooleanの変数を持たせて、チェックボックスの状態を保持し、 レンダリング時やエディタの初期表示時にそこを参照して表示するようにしてみたのですが、どうも動きがおかしいです。 TreeCellEditorのisCellEditableを実装して、マウスイベントを拾い、 ノードのboolean変数を切り替えるようにしたところ、ツリー初期表示後の一回目のクリックだけチェックがうまく切り替わりません(たとえばオフの状態で初期表示だと、クリックすると一瞬チェックが入ってまた外れます)。 それ以降のクリックは目的通りの動きになるのですが・・・・ デバッガで追ってみたところ、JComponentのpaintWithOffScreenBufferという関数が呼ばれた瞬間にチェックの状態が元に戻っていました。 (ちょっと質問がつながっていないかもしれませんが、) エディタで表示させたコンポーネントの状態はどのように取得すればよいのでしょうか。 ※今の実装はコンポーネントの状態を取得しているわけではないので、そのような処理にした方が良いのかなと思いました。 よろしくお願いいたします。