概要

JTreeで特定のノードだけ展開できないように設定します。

サンプルコード

class DirectoryExpandVetoListener implements TreeWillExpandListener {
  @Override public void treeWillExpand(TreeExpansionEvent e)
        throws ExpandVetoException {
    TreePath path = e.getPath();
    Object o = path.getLastPathComponent();
    if (o instanceof DefaultMutableTreeNode) {
      DefaultMutableTreeNode node = (DefaultMutableTreeNode) o;
      File file = (File) node.getUserObject();
      String title = file.getName();
      System.out.println(title);
      if (title.startsWith(".")) {
        throw new ExpandVetoException(e, "Tree expansion cancelled");
      }
    }
  }

  @Override public void treeWillCollapse(TreeExpansionEvent e) {
        // throws ExpandVetoException {
    // 何もしない(例外を返さない)ので、折り畳みは可能
  }
}
View in GitHub: Java, Kotlin

解説

  • TreeWillExpandListenerを実装し、treeWillExpand(...)メソッド内で、ノード(File)の名前がドットで始まる場合、ExpandVetoExceptionを発生させることでマウスクリックなどによる展開をキャンセル
    • これらのノードは展開は不可だが、選択自体は可能
  • 名前がドットで始まる場合、DefaultTreeCellRenderer#getTreeCellRendererComponent(...)内でそのノードをsetEnabled(false)で無効状態に変更して描画

参考リンク

コメント