Swing/RollOverTree のバックアップ(No.3)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/RollOverTree へ行く。
- 1 (2007-05-21 (月) 05:44:50)
- 2 (2007-06-04 (月) 14:16:04)
- 3 (2010-10-18 (月) 14:51:47)
- 4 (2011-05-14 (土) 15:09:01)
- 5 (2011-06-02 (木) 14:24:53)
- 6 (2013-02-06 (水) 02:14:44)
- 7 (2015-01-07 (水) 16:18:28)
- 8 (2015-02-27 (金) 12:03:38)
- 9 (2015-03-11 (水) 18:29:28)
- 10 (2017-02-07 (火) 13:13:38)
- 11 (2017-12-23 (土) 16:21:03)
- 12 (2019-12-12 (木) 15:16:53)
- 13 (2021-06-15 (火) 11:49:37)
TITLE:JTreeのノードをハイライト
Posted by terai at 2007-05-21
JTreeのノードをハイライト
JTreeのノード上にマウスカーソルがきたら、ハイライト表示します。
- &jnlp;
- &jar;
- &zip;
#screenshot
サンプルコード
class MyTreeCellRenderer extends DefaultTreeCellRenderer implements MouseMotionListener {
private static final Color rollOverRowColor = new Color(220,240,255);
private final JTree tree;
private final TreeCellRenderer renderer;
public MyTreeCellRenderer(JTree tree, TreeCellRenderer renderer) {
this.tree = tree;
this.renderer = renderer;
tree.addMouseMotionListener(this);
}
public Component getTreeCellRendererComponent(JTree tree, Object value, boolean isSelected,
boolean expanded, boolean leaf, int row, boolean hasFocus) {
JComponent c = (JComponent)renderer.getTreeCellRendererComponent(tree, value, isSelected, expanded, leaf, row, hasFocus);
if(row==rollOverRowIndex) {
c.setOpaque(true);
c.setBackground(rollOverRowColor);
if(isSelected) c.setForeground(getTextNonSelectionColor());
}else{
c.setOpaque(false);
}
return c;
}
private int rollOverRowIndex = -1;
public void mouseMoved(MouseEvent e) {
int row = tree.getRowForLocation(e.getX(), e.getY());
if(row!=rollOverRowIndex) {
//System.out.println(row);
rollOverRowIndex = row;
tree.repaint();
}
}
public void mouseDragged(MouseEvent e) {}
}
解説
JTreeからデフォルトのセルレンダラーを取得し、これを委譲してセルレンダラーを作成しています。
- 継承ではなく、委譲を使うのは、ノードをハイライトしない場合は、Windowsなどでのノードアイコンは選択されない、文字列だけ選択されるという描画をそのまま利用するため
- 継承もしているが、これは、JTableと違いDefaultTreeCellRendererからノードを選択した時の色などを取得するようになっているためで、あまり意味はない
このレンダラーはMouseMotionListenerを実装し、getTreeCellRendererComponentメソッドの実装で、ハイライト表示したいノードの場合は、 委譲したレンダラーから得たコンポーネントをsetOpaque(true)、setForeground(Color)などで修飾して返すようになっています。