Swing/RollOverTree のバックアップ差分(No.8)
- バックアップ一覧
- 現在との差分 を表示
- 現在との差分 - 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のノードをハイライト tags: [JTree, TreeCellRenderer, MouseMotionListener] author: aterai pubdate: 2007-05-21T05:44:50+09:00 description: JTreeのノード上にマウスカーソルがきたら、ハイライト表示します。 --- * 概要 [#daf3254b] `JTree`のノード上にマウスカーソルがきたら、ハイライト表示します。 #download(https://lh3.googleusercontent.com/_9Z4BYR88imo/TQTSHWXxwwI/AAAAAAAAAiQ/MP7tLgM--lo/s800/RollOverTree.png) * サンプルコード [#f55bb9a4] #code(link){{ 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); } @Override 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) { if (row == rollOverRowIndex) { c.setOpaque(true); c.setBackground(rollOverRowColor); if(isSelected) c.setForeground(getTextNonSelectionColor()); }else{ if (isSelected) c.setForeground(getTextNonSelectionColor()); } else { c.setOpaque(false); } return c; } private int rollOverRowIndex = -1; @Override public void mouseMoved(MouseEvent e) { int row = tree.getRowForLocation(e.getX(), e.getY()); if(row!=rollOverRowIndex) { if (row != rollOverRowIndex) { //System.out.println(row); rollOverRowIndex = row; tree.repaint(); } } @Override public void mouseDragged(MouseEvent e) {} } }} * 解説 [#v4d37257] `JTree`からデフォルトのセルレンダラーを取得し、これを委譲してセルレンダラーを作成しています。 - 継承ではなく、委譲を使うのは、ノードをハイライトしない場合は、`Windows`などでのノードアイコンは選択されない、文字列だけ選択されるという描画をそのまま利用するため - 継承もしているが、これは、`JTable`と違い`DefaultTreeCellRenderer`からノードを選択した時の色などを取得するようになっているためで、あまり意味はない このレンダラーは`MouseMotionListener`を実装し、`getTreeCellRendererComponent`メソッドの実装で、ハイライト表示したいノードの場合は、 委譲したレンダラーから得たコンポーネントを`setOpaque(true)`、`setForeground(Color)`などで修飾して返すようになっています。 * 参考リンク [#hbcd6288] - [[JTreeで条件に一致するノードを検索しハイライト>Swing/TreeNodeHighlightSearch]] * コメント [#hd3b807a] #comment #comment