概要
JTree
のノードからアイコンやテキストを取得してJToolTip
を生成し、それをノードセル上に重ねて表示します。
Screenshot
Advertisement
サンプルコード
class TooltipTree extends JTree {
protected final JLabel label = new JLabel() {
@Override public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();
d.height = getRowHeight();
return d;
}
};
protected TooltipTree(TreeModel model) {
super(model);
}
@Override public void updateUI() {
super.updateUI();
// setRowHeight(24);
setCellRenderer(new TooltipTreeCellRenderer());
}
@Override public Point getToolTipLocation(MouseEvent e) {
Point p = e.getPoint();
int i = getRowForLocation(p.x, p.y);
Rectangle cellBounds = getRowBounds(i);
if (i >= 0 && Objects.nonNull(cellBounds) && cellBounds.contains(p.x, p.y)) {
TreeSelectionModel tsm = getSelectionModel();
Object node = getPathForRow(i).getLastPathComponent();
// System.out.println(node);
boolean hasFocus = hasFocus() && tsm.getLeadSelectionRow() == i;
boolean isLeaf = getModel().isLeaf(node);
TreeCellRenderer r = getCellRenderer();
Component tcr = r.getTreeCellRendererComponent(
this, node, isRowSelected(i), isExpanded(i), isLeaf, i, hasFocus);
if (tcr instanceof JComponent
&& Objects.nonNull(((JComponent) tcr).getToolTipText())) {
Point pt = cellBounds.getLocation();
Insets ins = label.getInsets();
pt.translate(-ins.left, -ins.top);
label.setIcon(new RendererIcon(tcr, cellBounds));
return pt;
}
}
return null;
}
@Override public JToolTip createToolTip() {
JToolTip tip = new JToolTip() {
@Override public Dimension getPreferredSize() {
return label.getPreferredSize();
}
};
tip.setBorder(BorderFactory.createEmptyBorder());
tip.setLayout(new BorderLayout());
tip.setComponent(this);
tip.add(label);
return tip;
}
}
View in GitHub: Java, Kotlin解説
Draw directly above the cell
JTree
のノードセル上に重ねてJToolTip
を表示JTree#getRowBounds(int index)
メソッドで取得した領域上にJToolTip
を表示するTreeCellRenderer
からノードアイコンを含めてJToolTip
を生成
- JListのセル上にToolTipを表示する
WindowsLookAndFeel
以外で動作しない?- 葉ノードから親ノードにマウスカーソルを移動したとき
JToolTip
の内容が変更されない場合がある?再現する条件がまだはっきりしないが、マウスホイールによる移動が関係している模様- JListのセルのToolTipをMouseWheelEventに対応した表示位置に修正
Default location
- デフォルト位置に
JToolTip
を表示 - JTreeのToolTipsを表示
- デフォルト位置に