• category: swing folder: PreventNodeExpanding title: JTreeで展開不可のノードを設定する tags: [JTree, TreeWillExpandListener, File] author: aterai pubdate: 2014-01-27T00:45:37+09:00 description: JTreeで特定のノードだけ展開できないように設定します。 image: https://lh4.googleusercontent.com/-WcBsEg_mxgc/UuUbyvn84EI/AAAAAAAAB-0/iZ6t8_EGeZQ/s800/PreventNodeExpanding.png

概要

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)で無効状態に変更して描画

参考リンク

コメント