TITLE:JTableのTooltipsを行ごとに変更
Posted by terai at 2004-03-28

JTableのTooltipsを行ごとに変更

JTableのTooltipsが、カーソルのある行の内容などを表示するようにします。
  • category: swing folder: RowTooltips title: JTableのTooltipsを行ごとに変更 tags: [JTable, JToolTip, TableCellRenderer] author: aterai pubdate: 2005-03-28T02:50:10+09:00 description: JTableのTooltipsが、カーソルのある行の内容などを表示するように設定します。 image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTSbfFU7HI/AAAAAAAAAiw/EPWumbZCrr0/s800/RowTooltips.png

概要

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

#screenshot

サンプルコード

#spanend
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
JTable table = new JTable(model) {
  public String getToolTipText(MouseEvent e) {
    int row = rowAtPoint(e.getPoint());
  @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>";
    return "<html>" + m.getValueAt(row, 1) + "<br>"
                    + m.getValueAt(row, 2) + "</html>";
  }
};

解説

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

解説

JTable#getToolTipText()メソッドをオーバーライドして、カーソルがある行の情報を表示しています。 上記のサンプルでは、モデルにTableSorter.javaを使っているので、行のソートや列の移動があってもマウスの下の行の情報を一定のレイアウト*1で表示するように、セルの値の取得には、Table#getValueAtメソッドではなく、TableModel#getValueAtメソッドを使っています。
  • JTable#convertRowIndexToModel(...)メソッドを使用してviewRowIndexmodelRowIndexに変更し、モデルから行情報を取得
  • 1列、第2列をhtmlタグを使ってそれぞれToolTipTextとして設定

JDK 1.6 で導入されたTableRowSorterを使用して、上記の同じ動作をするツールチップにする場合は、新しく追加されたJTable#convertRowIndexToModelメソッドを使ってviewRowIndexをmodelRowIndexに変更してモデルから行情報を取得したり、逆にJTable#convertColumnIndexToViewメソッドを使って、modelColumnIndexからviewColumnIndexに変換してJTable#getValueAtメソッドを使う方法などがあります。
  • 以下のようにJTable#prepareRenderer(...)をオーバーライドしてその内部でsetToolTipText(...)メソッドを使用し、各行にToolTipTextを設定する方法もある
    #spandel
    JTable table = new JTable(model) {
    #spanend
      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>";
      }
    #spandel
    };
    #spanend
    #spandel
    TableRowSorter<TableModel> sorter = new TableRowSorter<TableModel>(model);
    #spanend
    #spandel
    table.setRowSorter(sorter);
    #spanend
    #spandel
    
  • - 以下のように、JTable#prepareRenderer メソッドや、CellRendererなどでsetToolTipTextを使用する方法でも、ツールチップを設定することができます。
    #spanend
    JTable table = new JTable() {
      public Component prepareRenderer(TableCellRenderer tcr, int row, int column) {
      @Override public Component prepareRenderer(
          TableCellRenderer tcr, int row, int column) {
        Component c = super.prepareRenderer(tcr, row, column);
        if(c instanceof JComponent) {
        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);
          String s = (o != null) ? o.toString() : null;
          ((JComponent) c).setToolTipText(s.isEmpty() ? null : s);
        }
        return c;
      }
    };
    
  • TableCellRenderer#getTableCellRendererComponent(...)メソッド内でsetToolTipText(...)を使用する
    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);
        //...
      @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;
      }
    });
    

参考リンク

参考リンク

コメント

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

コメント