Swing/ToolTipOnCellBounds のバックアップ(No.5)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ToolTipOnCellBounds へ行く。
- 1 (2014-05-05 (月) 01:10:29)
- 2 (2014-11-07 (金) 03:20:22)
- 3 (2015-12-03 (木) 18:20:31)
- 4 (2017-05-30 (火) 20:33:45)
- 5 (2018-05-16 (水) 20:23:02)
- 6 (2020-04-29 (水) 19:51:19)
- 7 (2021-10-29 (金) 10:14:13)
- 8 (2025-01-03 (金) 08:57:02)
- 9 (2025-01-03 (金) 09:01:23)
- 10 (2025-01-03 (金) 09:02:38)
- 11 (2025-01-03 (金) 09:03:21)
- 12 (2025-01-03 (金) 09:04:02)
- category: swing
folder: ToolTipOnCellBounds
title: JListのセル上にToolTipを表示する
tags: [JList, JToolTip, ListCellRenderer]
author: aterai
pubdate: 2014-05-05T01:10:29+09:00
description: JListのセル内に文字列が収まらない場合のみ、その上にToolTipを重ねて表示します。
image:
概要
JList
のセル内に文字列が収まらない場合のみ、その上にToolTip
を重ねて表示します。
Screenshot

Advertisement
サンプルコード
class TooltipList<E> extends JList<E> {
public TooltipList(ListModel<E> m) {
super(m);
}
@Override public Point getToolTipLocation(MouseEvent event) {
Point pt = null;
if (event != null) {
Point p = event.getPoint();
ListCellRenderer<? super E> r = getCellRenderer();
int i = locationToIndex(p);
Rectangle cb = getCellBounds(i, i);
if (i != -1 && r != null && cb != null && cb.contains(p.x, p.y)) {
ListSelectionModel lsm = getSelectionModel();
Component rc = r.getListCellRendererComponent(
this, getModel().getElementAt(i), i, lsm.isSelectedIndex(i),
hasFocus() && lsm.getLeadSelectionIndex() == i);
if (rc instanceof JComponent && ((JComponent) rc).getToolTipText() != null) {
pt = cb.getLocation();
}
}
}
return pt;
}
}
View in GitHub: Java, Kotlin解説
- 左:
CellBounds
JList#getToolTipLocation()
をオーバーライドして、表示するJToolTip
の原点をJList#getCellBounds(int, int)
で取得したセル領域の左上に変更
- 中:
ListCellRenderer
JList#getToolTipLocation()
をオーバーライドして、表示するJToolTip
の原点をJList#getCellBounds(int, int)
で取得したセル領域の左上に変更JList#createToolTip()
をオーバーライドして、セルの描画に使用するセルレンダラー自体をJToolTip
に追加- このため、対象セルが選択状態なら、
JToolTip
の背景色もそのセル選択色と同じになる
- このため、対象セルが選択状態なら、
- 右:
Default
JToolTip
の表示位置は、デフォルトのマウスカーソルの右下
セル内に文字列が収まっているかどうかは、以下のようなセルレンダラーを使用して判定しています。
class TooltipListCellRenderer extends DefaultListCellRenderer {
@Override public Component getListCellRendererComponent(
JList list, Object value, int index, boolean isSelected, boolean hasFocus) {
JLabel l = (JLabel) super.getListCellRendererComponent(
list, value, index, isSelected, hasFocus);
Insets i = l.getInsets();
Container c = SwingUtilities.getAncestorOfClass(JViewport.class, list);
Rectangle rect = c.getBounds();
rect.width -= i.left + i.right;
FontMetrics fm = l.getFontMetrics(l.getFont());
String str = Objects.toString(value, "");
l.setToolTipText(fm.stringWidth(str) > rect.width ? str : null);
return l;
}
}