概要
JTable
のセル中に複数個配置したコンポーネントにそれぞれJToolTip
が表示されるように設定します。
Screenshot
Advertisement
サンプルコード
JTable table = new JTable(model) {
@Override public String getToolTipText(MouseEvent e) {
Point pt = e.getPoint();
int vrow = rowAtPoint(pt);
int vcol = columnAtPoint(pt);
int mcol = convertColumnIndexToModel(vcol);
if (mcol == 1) {
TableCellRenderer tcr = getCellRenderer(vrow, vcol);
Component c = prepareRenderer(tcr, vrow, vcol);
if (c instanceof JPanel) {
Rectangle r = getCellRect(vrow, vcol, true);
c.setBounds(r);
c.doLayout();
pt.translate(-r.x, -r.y);
Component l = SwingUtilities.getDeepestComponentAt(c, pt.x, pt.y);
if (l instanceof JLabel) {
ImageIcon icon = (ImageIcon) ((JLabel) l).getIcon();
return icon.getDescription();
}
}
}
return super.getToolTipText(e);
}
};
View in GitHub: Java, Kotlin解説
上記のサンプルでは、JTable#getToolTipText(MouseEvent)
をオーバーライドして、JTable
のセルに複数配置したコンポーネントの情報をToolTipText
として返すように設定しています。
JTable#prepareRenderer(...)
メソッドで現在マウスカーソルがあるセルのセルレンダラーを取得- 取得したセルレンダラー内のコンポーネントの位置、サイズなどのレイアウトを更新
- 更新したコンポーネント内から
SwingUtilities.getDeepestComponentAt()
メソッドでマウスカーソル直下のアイコン(JLabel
)を取得 ImageIcon#getDescription()
で取得した文字列をToolTipText
として返す
参考リンク
- java - Tool tip in JPanel in JTable not working - Stack Overflow
- JTableのTooltipsを行ごとに変更
- JListのセル中に配置したコンポーネント毎にカーソルを変更する