TITLE:JTableのTooltipsを行ごとに変更

Posted by terai at 2004-03-28

JTableのTooltipsを行ごとに変更

JTableのTooltipsが、カーソルのある行の内容などを表示するようにします。

  • &jnlp;
  • &jar;
  • &zip;

#screenshot

サンプルコード

JTable table = new JTable(sorter) {
  public String getToolTipText(MouseEvent e) {
    int row = rowAtPoint(e.getPoint());
    TableModel m = getModel();
    return "<html>"+m.getValueAt(row, 1)+"<br>"
                   +m.getValueAt(row, 2)+"</html>";
  }
};

解説

JTableのgetToolTipTextメソッドをオーバーライドして、カーソルがある行の情報を表示しています。第1列、第2列をhtmlタグを使ってそれぞれTooltipsにしています。

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


JDK 1.6 で導入されたTableRowSorterを使用して、上記の同じ動作をするツールチップにする場合は、新しく追加されたJTable#convertRowIndexToModelメソッドを使ってviewRowIndexをmodelRowIndexに変更してモデルから行情報を取得したり、逆にJTable#convertColumnIndexToViewメソッドを使って、modelColumnIndexからviewColumnIndexに変換してJTable#getValueAtメソッドを使う方法などがあります。

JTable table = new JTable(model) {
  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を使用する方法でも、ツールチップを設定することができます。

JTable table = new JTable() {
  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;
  }
};
table.setDefaultRenderer(Object.class, new DefaultTableCellRenderer() {
  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;
  }
});

参考リンク

コメント

  • 名前もコメントも空の場合は、空のツールチップが表示されないように、nullを返すようにした方がいいかも。 -- terai