---
category: swing
folder: RolloverConnectionLines
title: JTreeのノード接続線や展開折り畳みアイコンの表示状態をマウスカーソルのロールオーバーで切り替える
tags: [JTree, MouseListener]
author: aterai
pubdate: 2021-11-08T02:43:26+09:00
description: JTreeのノード接続線や展開・折り畳みアイコンの表示・非表示をマウスカーソルのロールオーバーで切り替えます。
image: https://drive.google.com/uc?id=1n1zUhfc3RSih07_Oy4Bby4HN4kaLxLDy
---
* 概要 [#summary]
JTreeのノード接続線や展開・折り畳みアイコンの表示・非表示をマウスカーソルのロールオーバーで切り替えます。
`JTree`のノード接続線や展開・折り畳みアイコンの表示・非表示をマウスカーソルのロールオーバーで切り替えます。

#download(https://drive.google.com/uc?id=1n1zUhfc3RSih07_Oy4Bby4HN4kaLxLDy)

* サンプルコード [#sourcecode]
#code(link){{
JTree tree = new JTree() {
  private boolean rollover;
  private transient MouseAdapter rolloverHandler;
  @Override public void updateUI() {
    removeMouseListener(rolloverHandler);
    super.updateUI();
    rolloverHandler = new MouseAdapter() {
      @Override public void mouseEntered(MouseEvent e) {
        rollover = true;
        repaint();
      }

      @Override public void mouseExited(MouseEvent e) {
        rollover = false;
        repaint();
      }
    };
    addMouseListener(rolloverHandler);
    setUI(new BasicTreeUI() {
      @Override protected boolean shouldPaintExpandControl(
          TreePath path, int row, boolean isExpanded,
          boolean hasBeenExpanded, boolean isLeaf) {
        return rollover && super.shouldPaintExpandControl(
            path, row, isExpanded, hasBeenExpanded, isLeaf);
      }

      @Override protected void paintHorizontalLine(
          Graphics g, JComponent c, int y, int left, int right) {
        if (rollover) {
          super.paintHorizontalLine(g, c, y, left, right);
        }
      }

      @Override protected void paintVerticalLine(
          Graphics g, JComponent c, int x, int top, int bottom) {
        if (rollover) {
          super.paintVerticalLine(g, c, x, top, bottom);
        }
      }
    });
  }
};
}}

* 解説 [#explanation]
上記のサンプルでは`JTree`に`MouseListener`を設定してマウスカーソルが`JTree`上に存在するときだけノード接続線や展開・折り畳みアイコンを表示しています。

- ノード接続水平線
-- `BasicTreeUI#paintHorizontalLine(...)`をオーバーライド
- ノード接続垂直線
-- `BasicTreeUI#paintVerticalLine(...)`をオーバーライド
- 展開・折り畳みアイコン
-- `BasicTreeUI#shouldPaintExpandControl(...)`をオーバーライド

* 参考リンク [#reference]
- [[JTreeの水平垂直線を表示しない>Swing/TreePaintLines]]
-- `UIManager.put("Tree.paintLines", Boolean.FALSE)`ですべての`JTree`でノード接続線を非表示にしている
- [[JTreeの展開、折畳みアイコンを非表示にする>Swing/TreeExpandedIcon]]
-- `UIManager.put("Tree.expandedIcon", new IconUIResource(emptyIcon))`で空アイコンを設定し、すべての`JTree`で展開アイコンを非表示にしている

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