概要

JTreeのノード接続線や展開・折り畳みアイコンの表示・非表示をマウスカーソルのロールオーバーで切り替えます。

スクリーンショット

Swing/RolloverConnectionLines.png

サンプルコード

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);
        }
      }
    });
  }
};
View in GitHub: Java, Kotlin

解説

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

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

参考リンク

コメント