• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTreeの葉ノードだけ編集可能にする
#navi(../)
#tags()
RIGHT:Posted by &author(aterai); at 2010-04-12
*JTreeの葉ノードだけ編集可能にする [#ja3545ca]
JTreeの葉ノードだけ編集可能にします。
---
category: swing
folder: LeafTreeCellEditor
title: JTreeの葉ノードだけ編集可能にする
tags: [JTree, TreeCellEditor, TreeNode]
author: aterai
pubdate: 2010-04-12T18:23:41+09:00
description: JTreeのノードラベル編集が、葉ノードの場合だけ可能になるよう設定します。
image: https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTPB-TVk9I/AAAAAAAAAdU/Aq5YDSMvqaY/s800/LeafTreeCellEditor.png
---
* 概要 [#summary]
`JTree`のノードラベル編集が、葉ノードの場合だけ可能になるよう設定します。

-&jnlp;
-&jar;
-&zip;
#download(https://lh5.googleusercontent.com/_9Z4BYR88imo/TQTPB-TVk9I/AAAAAAAAAdU/Aq5YDSMvqaY/s800/LeafTreeCellEditor.png)

//#screenshot
#ref(http://lh5.ggpht.com/_9Z4BYR88imo/TQTPB-TVk9I/AAAAAAAAAdU/Aq5YDSMvqaY/s800/LeafTreeCellEditor.png)

**サンプルコード [#bc2dfe8c]
* サンプルコード [#sourcecode]
#code(link){{
class LeafTreeCellEditor extends DefaultTreeCellEditor {
  public LeafTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
  protected LeafTreeCellEditor(JTree tree, DefaultTreeCellRenderer renderer) {
    super(tree, renderer);
  }
  @Override public boolean isCellEditable(java.util.EventObject e) {
    boolean b = super.isCellEditable(e);

  @Override public boolean isCellEditable(EventObject e) {
    Object o = tree.getLastSelectedPathComponent();
    if(b && o!=null && o instanceof TreeNode) {
      return ((TreeNode)o).isLeaf();
    }else{
      return b;
    if (super.isCellEditable(e) && o instanceof TreeNode) {
      return ((TreeNode) o).isLeaf();
    } else {
      return false;
    }
  }
}
}}

**解説 [#n0670581]
上記のサンプルでは、CellEditor#isCellEditable メソッドを葉ノードの場合だけ、編集を開始できるようにオーバーライドしたセルエディタを作成、設定しています。
* 解説 [#explanation]
上記のサンプルでは、`CellEditor#isCellEditable(...)`メソッドをオーバーライドして葉ノードのみ編集が可能にしたセルエディタを作成し、これを以下のように`JTree#setCellEditor(...)`メソッドで設定しています。

#code{{
tree.setCellEditor(new LeafTreeCellEditor(tree, (DefaultTreeCellRenderer)tree.getCellRenderer()));
tree.setCellEditor(
  new LeafTreeCellEditor(tree, (DefaultTreeCellRenderer) tree.getCellRenderer()));
}}

ルートノードなどの枝ノードは、トリプルクリックしても編集不可になっています。
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/CellEditor.html#isCellEditable-java.util.EventObject- CellEditor#isCellEditable(EventObject) (Java Platform SE 8)]
- [https://community.oracle.com/thread/1371600 Swing - How can I persist all changes I made to these edited leaves and nodes??]

**参考リンク [#ha42a5fc]
-[http://forums.sun.com/thread.jspa?threadID=5161819 Swing - How can I persist all changes I made to these edited leaves and nodes??]

**コメント [#zc7bd3a1]
* コメント [#comment]
#comment
#comment