TITLE:JTableのTooltipsを行ごとに変更
#navi(../)
RIGHT:Posted by &author(aterai); at 2004-03-28
*JTableのTooltipsを行ごとに変更 [#gb8e2d40]
JTableのTooltipsが、カーソルのある行の内容などを表示するようにします。

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

//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTSbfFU7HI/AAAAAAAAAiw/EPWumbZCrr0/s800/RowTooltips.png)

**サンプルコード [#t48b17d4]
#code(link){{
JTable table = new JTable(model) {
  @Override public String getToolTipText(MouseEvent e) {
    int row = convertRowIndexToModel(rowAtPoint(e.getPoint()));
    TableModel m = getModel();
    return "<html>"+m.getValueAt(row, 1)+"<br>"
                   +m.getValueAt(row, 2)+"</html>";
  }
};
}}

**解説 [#t35291c0]
JTableのgetToolTipTextメソッドをオーバーライドして、カーソルがある行の情報を表示しています。

- JTable#convertRowIndexToModelメソッドを使ってviewRowIndexをmodelRowIndexに変更し、モデルから行情報を取得
- 第1列、第2列をhtmlタグを使ってそれぞれTooltipsに設定


//上記のサンプルでは、モデルにTableSorter.javaを使っているので、行のソートや列の移動があってもマウスの下の行の情報を一定のレイアウト((このサンプルの場合、Tooltipの上部に名前、下部にコメント))で表示するように、セルの値の取得には、Table#getValueAtメソッドではなく、TableModel#getValueAtメソッドを使っています。

//----
//JDK 1.6 で導入されたTableRowSorterを使用して、上記の同じ動作をするツールチップにする場合は、新しく追加された
//逆にJTable#convertColumnIndexToViewメソッドを使って、modelColumnIndexからviewColumnIndexに変換してJTable#getValueAtメソッドを使う方法などがあります。
//#code{{
//JTable table = new JTable(model) {
//  @Override public String getToolTipText(MouseEvent e) {
//    int row = convertRowIndexToModel(rowAtPoint(e.getPoint()));
//    TableModel m = getModel();
//    return "<html>"+m.getValueAt(row, 1)+"<br>"+m.getValueAt(row, 2)+"</html>";
//    //int row = rowAtPoint(e.getPoint());
//    //int vc1 = convertColumnIndexToView(1);
//    //int vc2 = convertColumnIndexToView(2);
//    //return "<html>"+getValueAt(row, vc1)+"<br>"+getValueAt(row, vc2)+"</html>";
//  }
//};
//TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
//table.setRowSorter(sorter);
//}}

----
以下のように、JTable#prepareRenderer メソッドや、CellRendererなどでsetToolTipTextを使用する方法でも、ツールチップを設定することができます。
#code{{
JTable table = new JTable() {
  @Override public Component prepareRenderer(
        TableCellRenderer tcr, int row, int column) {
    Component c = super.prepareRenderer(tcr, row, column);
    if(c instanceof JComponent) {
      int mr = convertRowIndexToModel(row);
      int mc = convertColumnIndexToModel(column);
      Object o = getModel().getValueAt(mr, mc);
      String s = (o!=null)?o.toString():null;
      ((JComponent)c).setToolTipText(s.isEmpty()?null:s);
    }
    return c;
  }
};
}}
#code{{
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
  @Override public Component getTableCellRendererComponent(
      JTable table, Object value, boolean isSelected,
      boolean hasFocus, int row, int column) {
    super.getTableCellRendererComponent(
      table, value, isSelected, hasFocus, row, column);
    //...
    this.setToolTipText(...);
    return this;
  }
});
}}

**参考リンク [#cc50cbc5]
-[http://java.sun.com/docs/books/tutorial/uiswing/components/table.html#celltooltip How to Use Tables (The Java™ Tutorials > Creating a GUI with JFC/Swing > Using Swing Components)]
-[[JTableHeaderのTooltipsを列ごとに変更>Swing/HeaderTooltips]]
-[[JTableのセルがクリップされている場合のみJToolTipを表示>Swing/ClippedCellTooltips]]

**コメント [#y73c58db]
- 名前もコメントも空の場合は、空のツールチップが表示されないように、nullを返すようにした方がいいかも。 -- [[aterai]] &new{2007-04-04 (水) 19:26:19};

#comment