Swing/ClippedCellTooltips のバックアップ(No.16)
- バックアップ一覧
- 差分 を表示
- 現在との差分 を表示
- 現在との差分 - Visual を表示
- ソース を表示
- Swing/ClippedCellTooltips へ行く。
- 1 (2009-10-12 (月) 17:37:22)
- 2 (2009-10-13 (火) 16:39:07)
- 3 (2011-03-13 (日) 21:44:49)
- 4 (2013-01-05 (土) 19:53:38)
- 5 (2013-10-17 (木) 14:57:55)
- 6 (2015-02-06 (金) 19:36:07)
- 7 (2015-03-12 (木) 15:08:59)
- 8 (2016-12-22 (木) 11:54:42)
- 9 (2016-12-22 (木) 19:16:41)
- 10 (2017-12-09 (土) 02:03:40)
- 11 (2019-08-07 (水) 20:21:19)
- 12 (2021-04-07 (水) 11:07:53)
- 13 (2023-03-23 (木) 21:44:23)
- 14 (2025-01-03 (金) 08:57:02)
- 15 (2025-01-03 (金) 09:01:23)
- 16 (2025-01-03 (金) 09:02:38)
- 17 (2025-01-03 (金) 09:03:21)
- 18 (2025-01-03 (金) 09:04:02)
- category: swing
folder: ClippedCellTooltips
title: JTableのセルがクリップされている場合のみJToolTipを表示
tags: [JTable, JTableHeader, TableCellRenderer, JToolTip]
author: aterai
pubdate: 2009-10-12T17:37:22+09:00
description: JTableのセルがクリップされている場合のみJToolTipを表示します。
image:
Summary
JTable
のセルがクリップされている場合のみJToolTip
を表示します。
Screenshot

Advertisement
Source Code Examples
class ToolTipHeaderRenderer implements TableCellRenderer {
// private final Icon icon = UIManager.getIcon("Table.ascendingSortIcon");
@Override public Component getTableCellRendererComponent(JTable table,
Object value, boolean isSelected, boolean hasFocus, int row, int column) {
JTableHeader header = table.getTableHeader();
TableCellRenderer r = header.getDefaultRenderer();
Component c = r.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
if (c instanceof JLabel) {
JLabel l = (JLabel) c;
Insets i = l.getInsets();
Rectangle rect = header.getHeaderRect(column);
rect.width -= i.left + i.right;
boolean isClipped = isClipped(l, rect);
// isClipped = fontMetrics.stringWidth(l.getText()) > rect.width;
l.setToolTipText(isClipped ? l.getText() : header.getToolTipText());
}
return c;
}
private static boolean isClipped(JLabel label, Rectangle viewR) {
Rectangle iconR = new Rectangle();
Rectangle textR = new Rectangle();
String str = SwingUtilities.layoutCompoundLabel(
label,
label.getFontMetrics(label.getFont()),
label.getText(),
label.getIcon(),
label.getVerticalAlignment(),
label.getHorizontalAlignment(),
label.getVerticalTextPosition(),
label.getHorizontalTextPosition(),
viewR,
iconR,
textR,
label.getIconTextGap());
return !Objects.equals(label.getText(), str);
}
}
View in GitHub: Java, Kotlin解説
- ヘッダセル
TableCellRenderer
内でセルの幅と文字列の長さを比較しToolTip
を設定- ソートアイコンなどが存在する場合を考慮して
SwingUtilities.layoutCompoundLabel(...)
メソッドを使用してJLabel
内の文字列が省略されているかどうかを判断する ソートアイコンと文字列の間隔はJLabel#getIconTextGap()
で取得してセル幅から除外するWindows 10
で使用されるWindowsLookAndFeel
のように文字列の上にソートアイコンが表示される場合(TableCellRenderer#getIcon()
がnull
)はこのアイコンの幅を無視する
- セル
JTable#prepareRenderer
メソッドをオーバーライドし、セルの幅と文字列の長さを比較してToolTip
を設定
JTable table = new JTable(model) {
@Override public Component prepareRenderer(
TableCellRenderer tcr, int row, int column) {
Component c = super.prepareRenderer(tcr, row, column);
if (c instanceof JComponent) {
JComponent l = (JComponent) c;
Insets i = l.getInsets();
Rectangle rect = getCellRect(row, column, false);
rect.width -= i.left + i.right;
FontMetrics fm = l.getFontMetrics(l.getFont());
String str = Objects.toString(getValueAt(row, column), "");
int cellTextWidth = fm.stringWidth(str);
l.setToolTipText(cellTextWidth > rect.width ? str : getToolTipText());
}
return c;
}
};