JTreeのノードをハイライト
Total: 8919
, Today: 1
, Yesterday: 2
Posted by aterai at
Last-modified:
概要
JTree
のノード上にマウスカーソルがきたら、ハイライト表示します。
Screenshot
Advertisement
サンプルコード
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解説
JTree
にMouseMotionListener
を設定して現在マウスカーソルが存在する行を記録DefaultTreeCellRenderer#getTreeCellRendererComponent(...)
メソッドをオーバーライドし、カーソル行の場合はsetOpaque(true)
でノードの不透明設定とsetForeground(Color)
で背景色を変更DefaultTreeCellRenderer
はDefaultTableCellRenderer
とは異なりDefaultTreeCellRenderer#getTextNonSelectionColor()
などのメソッドが使用可能DefaultTableCellRenderer
には選択時の文字色や背景色を取得するメソッドが存在しないのでJTable#getSelectionBackground()
などを使用する必要がある