---
category: swing
folder: AsksAllowsChildren
title: JTreeで葉ノードが存在しない親ノードの描画を変更する
tags: [JTree, DefaultTreeModel, DefaultMutableTreeNode, Icon]
author: aterai
pubdate: 2014-09-22T00:06:58+09:00
description: JTreeの親ノードに子として葉ノードがひとつも存在しない場合でも、フォルダアイコン表示になるよう設定します。
image: https://lh6.googleusercontent.com/-vfEqezCRy2w/VB7mN-AcppI/AAAAAAAACNg/VkZLdGkiDRQ/s800/AsksAllowsChildren.png
---
* 概要 [#summary]
`JTree`の親ノードに子として葉ノードがひとつも存在しない場合でも、フォルダアイコン表示になるよう設定します。

#download(https://lh6.googleusercontent.com/-vfEqezCRy2w/VB7mN-AcppI/AAAAAAAACNg/VkZLdGkiDRQ/s800/AsksAllowsChildren.png)

* サンプルコード [#sourcecode]
#code(link){{
DefaultTreeModel model = (DefaultTreeModel) tree.getModel();
model.setAsksAllowsChildren(true);
}}

* 解説 [#explanation]
- `DefaultTreeModel#setAsksAllowsChildren(false)`
-- デフォルト
-- `DefaultMutableTreeNode`が親ノード(`DefaultMutableTreeNode#getAllowsChildren() == true`)であっても子として葉ノードがひとつも存在しない場合、そのアイコンは葉ノードアイコンになる
-- `JTree`に`TreeWillExpandListener`を追加し、この親ノード(葉ノードが存在しない)をマウスでクリックしても`treeWillExpand(...)`は発生しない
- `DefaultTreeModel#setAsksAllowsChildren(true)`(チェックボックスで選択した場合)
-- `DefaultMutableTreeNode`が親ノード(`DefaultMutableTreeNode#getAllowsChildren() == true`)の場合、子として葉ノードが存在するかどうかにかかわらずそのアイコンは親ノードアイコンになる
-- `JTree`に`TreeWillExpandListener`を追加し、この親ノード(葉ノードが存在しない)をクリックすると`treeWillExpand(...)`が発生する
--- このタイミングで後からこの親ノードに子ノードを追加するといった処理が可能になる

* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#setAsksAllowsChildren-boolean- DefaultTreeModel#setAsksAllowsChildren(boolean) (Java Platform SE 8)]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/tree/DefaultTreeModel.html#isLeaf-java.lang.Object- DefaultTreeModel#isLeaf(...) (Java Platform SE 8)]で`askAllowsChildren`と`s`が抜けて誤字になっている
-- [https://bugs.openjdk.java.net/browse/JDK-8037573 [JDK-8037573] Typo in DefaultTreeModel docs: askAllowsChildren instead of asksAllowsChildren - Java Bug System]で修正される予定
-- [https://bugs.openjdk.org/browse/JDK-8037573 [JDK-8037573] Typo in DefaultTreeModel docs: askAllowsChildren instead of asksAllowsChildren - Java Bug System]で修正される予定

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