• category: swing folder: RollOverTree title: JTreeのノードをハイライト tags: [JTree, TreeCellRenderer, MouseMotionListener] author: aterai pubdate: 2007-05-21T05:44:50+09:00 description: JTreeのノード上にマウスカーソルがきたら、ハイライト表示します。 image: https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTSHWXxwwI/AAAAAAAAAiQ/MP7tLgM--lo/s800/RollOverTree.png

概要

JTreeのノード上にマウスカーソルがきたら、ハイライト表示します。

サンプルコード

private final JTree tree = new JTree(makeModel()) {
  private final Color rolloverRowColor = new Color(220, 240, 255);
  private int rollOverRowIndex = -1;
  private transient MouseMotionListener listener;
  @Override public void updateUI() {
    removeMouseMotionListener(listener);
    super.updateUI();
    setCellRenderer(new DefaultTreeCellRenderer() {
      @Override public Component getTreeCellRendererComponent(
          JTree tree, Object value, boolean selected, boolean expanded,
          boolean leaf, int row, boolean hasFocus) {
        JComponent c = (JComponent) super.getTreeCellRendererComponent(
            tree, value, selected, expanded, leaf, row, hasFocus);
        if (row == rollOverRowIndex) {
          c.setOpaque(true);
          c.setBackground(rolloverRowColor);
          if (selected) {
            c.setForeground(getTextNonSelectionColor());
          }
        } else {
          c.setOpaque(false);
        }
        return c;
      }
    });
    listener = new MouseAdapter() {
      @Override public void mouseMoved(MouseEvent e) {
        int row = getRowForLocation(e.getX(), e.getY());
        if (row != rollOverRowIndex) {
          rollOverRowIndex = row;
          repaint();
        }
      }
    };
    addMouseMotionListener(listener);
  }
};
View in GitHub: Java, Kotlin

解説

  • JTreeMouseMotionListenerを設定して現在マウスカーソルが存在する行を記録
  • DefaultTreeCellRenderer#getTreeCellRendererComponent(...)メソッドをオーバーライドし、カーソル行の場合はノードの不透明設定(setOpaque(true))と背景色を変更(setForeground(Color))
  • DefaultTreeCellRendererは、JTableとは異なり、DefaultTreeCellRenderer#getTextNonSelectionColor()などのメソッドが使用可能
    • DefaultTableCellRendererに選択時の文字色や背景色を取得するメソッドはなく、JTable#getSelectionBackground()などを使用する

参考リンク

コメント