TITLE:JTableのセルに複数配置したコンポーネントのJToolTip

Posted by at 2012-12-03

JTableのセルに複数配置したコンポーネントのJToolTip

`JTableのセル中に複数個配置したコンポーネントにそれぞれJToolTip`が表示されるように設定します。

  • &jnlp;
  • &jar;
  • &zip;
TooltipInTableCell.png

サンプルコード

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!=null && 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#getCellRect(...)`で、カーソル下のセル描画に使用されるコンポーネントを取得
  • 取得したコンポーネントの位置、サイズ、レイアウトを更新
  • 更新したコンポーネント内から、`SwingUtilities.getDeepestComponentAt()で、カーソル下のアイコン(JLabel`)を取得
  • `ImageIcon#getDescription()で取得した文字列をToolTipText`として返す

参考リンク

コメント