• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableのセルがクリップされている場合のみJToolTipを表示
#navi(../)
RIGHT:Posted by [[terai]] at 2009-10-12
*JTableのセルがクリップされている場合のみJToolTipを表示 [#kb1661a0]
JTableのセルがクリップされている場合のみJToolTipを表示します。

-&jnlp;
-&jar;
-&zip;

#screenshot

**サンプルコード [#a310ddc6]
#code{{
class ToolTipHeaderRenderer implements TableCellRenderer {
  private final TableCellRenderer renderer;
  private final Icon icon = UIManager.getIcon("Table.ascendingSortIcon");
  public ToolTipHeaderRenderer(TableCellRenderer renderer) {
    this.renderer  = renderer;
  }
  public Component getTableCellRendererComponent(JTable table,Object value,
          boolean isSelected, boolean hasFocus, int row, int column) {
    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
    }
    FontMetrics fm = l.getFontMetrics(l.getFont());
    String str = value.toString();
    int cellTextWidth = fm.stringWidth(str);
    l.setToolTipText(cellTextWidth>rect.width?str:null);
    return l;
  }
}
}}

**解説 [#rb49016f]
-ヘッダセル
--TableCellRendererで、セルの幅と文字列の長さを比較して、ToolTipを設定
--ソートアイコンと文字列の間のgapが不明?

-セル
--JTable#prepareRendererメソッドをオーバーライドし、セルの幅と文字列の長さを比較して、ToolTipを設定

#code{{
JTable table = new JTable(model) {
  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;
  }
};
}}

**参考リンク [#l13d8dfe]
-[[JTableHeaderのTooltipsを列ごとに変更>Swing/HeaderTooltips]]
-[[JTableのTooltipsを行ごとに変更>Swing/RowTooltips]]

**参考リンク [#l13d8dfe]
**コメント [#kb103118]
#comment