JTableのセルがクリップされている場合のみJToolTipを表示
Total: 5117
, Today: 1
, Yesterday: 5
Posted by aterai at
Last-modified:
概要
JTable
のセルがクリップされている場合のみJToolTip
を表示します。
サンプルコード
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) {
TableCellRenderer renderer = table.getTableHeader().getDefaultRenderer();
JLabel l = (JLabel) renderer.getTableCellRendererComponent(
table, value, isSelected, hasFocus, row, column);
Insets i = l.getInsets();
Rectangle rect = table.getCellRect(row, column, false);
rect.width -= i.left + i.right;
// RowSorter<? extends TableModel> sorter = table.getRowSorter();
// if (sorter != null && !sorter.getSortKeys().isEmpty()
// && sorter.getSortKeys().get(0).getColumn() == column) {
// rect.width -= icon.getIconWidth() + 2; // XXX
// }
Optional.ofNullable(l.getIcon())
.ifPresent(icon -> rect.width -= icon.getIconWidth() + l.getIconTextGap());
FontMetrics fm = l.getFontMetrics(l.getFont());
String str = value.toString();
int cellTextWidth = fm.stringWidth(str);
l.setToolTipText(cellTextWidth > rect.width ? str : null);
return l;
}
}
view all解説
- ヘッダセル
TableCellRenderer
内でセルの幅と文字列の長さを比較しToolTip
を設定- ソートアイコンと文字列の間の
gap
は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;
Object o = getValueAt(row, column);
Insets i = l.getInsets();
Rectangle rect = getCellRect(row, column, false);
rect.width -= i.left + i.right;
FontMetrics fm = l.getFontMetrics(l.getFont());
String str = o.toString();
int cellTextWidth = fm.stringWidth(str);
l.setToolTipText(cellTextWidth > rect.width ? str : null);
}
return c;
}
};