概要

JTreeのノードがキー入力で選択されたとき、そのノードまで垂直方向だけでなく水平方向にもスクロールするよう設定します。

スクリーンショット

Swing/TreeScrollsHorizontallyAndVertically.png

サンプルコード

JTree tree1 = new JTree(makeTreeRoot());
expandAll(tree1);

JTree tree2 = new JTree(makeTreeRoot());
expandAll(tree2);
tree2.addTreeSelectionListener(e ->
    tree2.scrollPathToVisible(e.getNewLeadSelectionPath()));

String key = "Tree.scrollsHorizontallyAndVertically";
JCheckBoxMenuItem check = new JCheckBoxMenuItem(key);
check.addActionListener(e -> UIManager.put(key, check.isSelected()));

JMenu menu = new JMenu("View");
menu.add(check);

JMenuBar mb = new JMenuBar();
mb.add(menu);
mb.add(LookAndFeelUtil.createLookAndFeelMenu());
EventQueue.invokeLater(() -> getRootPane().setJMenuBar(mb));

add(makeTitledPanel("Default", new JScrollPane(tree1)));
add(makeTitledPanel("TreeSelectionListener", new JScrollPane(tree2)));
View in GitHub: Java, Kotlin

解説

  • Default
    • JTreeのノードサイズが大きく垂直・水平スクロールバーが表示されている状態でカーソルキーやマウスクリックでノードを選択しても水平方向にはスクロールしない
  • Tree.scrollsHorizontallyAndVertically
    • UIManager.put("Tree.scrollsHorizontallyAndVertically", true)でキー入力でノード選択した場合そのノード領域が可能な限り表示されるよう垂直・水平方向ともにスクロールする
    • Tree.scrollsHorizontallyAndVerticallyの初期値はBoolean.FALSE
    • この設定はマウスでのノード選択には無効
      • キー入力でも複数ノード選択時は効果がない
    • この設定はWindowsLookAndFeelでは無効
  • TreeSelectionListener
    • TreeSelectionListenerを追加してJTree.scrollPathToVisible(TreeSelection#getNewLeadSelectionPath())を実行し、マウスやキー入力によるノード選択で垂直・水平ともにスクロールするよう設定

参考リンク

コメント