• category: swing folder: AutoChapterNumberingTreeNode title: JTreeの各ノードタイトルに章番号を自動追加して表示する tags: [JTree, TreeNode, TreeCellRenderer] author: aterai pubdate: 2017-03-06T15:12:27+09:00 description: JTreeの各ノードに章番号を自動的に追加し、タイトル先頭にそれを表示するTreeCellRendererを作成します。 image: https://drive.google.com/uc?export=view&id=1sr9avobwqRpWX2bNvLVutxduLQa66KvKTg

概要

JTreeの各ノードに章番号を自動的に追加し、タイトル先頭にそれを表示するTreeCellRendererを作成します。

サンプルコード

class ChapterNumberingTreeCellRenderer extends DefaultTreeCellRenderer {
  private static final String MARK = "\u00a7"; //"§";
  @Override public Component getTreeCellRendererComponent(
      JTree tree, Object value, boolean selected, boolean expanded,
      boolean leaf, int row, boolean hasFocus) {
    JLabel l = (JLabel) super.getTreeCellRendererComponent(
        tree, value, selected, expanded, leaf, row, hasFocus);
    if (value instanceof DefaultMutableTreeNode) {
      TreeNode[] tn = ((DefaultMutableTreeNode) value).getPath();
      String s = IntStream.range(1, tn.length).mapToObj(i -> {
        TreeNode n = tn[i];
        TreeNode p = n.getParent();
        return String.valueOf(1 + p.getIndex(n));
      }).collect(Collectors.joining("."));
      l.setText(String.format("%s%s %s", MARK, s, value));
    }
    return l;
  }
}
View in GitHub: Java, Kotlin

解説

  • DefaultTreeCellRenderer#getTreeCellRendererComponent(...)をオーバーライドし、ノードの章番号を追加する
    • DefaultMutableTreeNode#getPath()で、ルートノードから自ノードまでのノード配列を取得
    • ルートノードを除く各ノードで、自ノードが何番目のノードかをTreeNode#getIndex()で取得し、.で結合した文字列に変換

参考リンク

コメント