• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableHeaderのTooltipsを列ごとに変更
#navi(../)
RIGHT:Posted by [[terai]] at 2005-05-23
*JTableHeaderのTooltipsを列ごとに変更 [#k51269f9]
JTableHeaderのTooltipsが、カーソルのある列の内容などを表示するようにします。
---
category: swing
folder: HeaderTooltips
title: JTableHeaderのTooltipsを列ごとに変更
tags: [JTable, JTableHeader, JToolTip]
author: aterai
pubdate: 2005-05-23T10:16:01+09:00
description: JTableHeaderのTooltipsがカーソルのある列の内容などを表示するようにします。
image: https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTNx5xm6BI/AAAAAAAAAbU/LCSjxDNp8p0/s800/HeaderTooltips.png
---
* 概要 [#summary]
`JTableHeader`の`Tooltips`がカーソルのある列の内容などを表示するようにします。

-&jnlp;
-&jar;
-&zip;
#download(https://lh6.googleusercontent.com/_9Z4BYR88imo/TQTNx5xm6BI/AAAAAAAAAbU/LCSjxDNp8p0/s800/HeaderTooltips.png)

#screenshot

**サンプルコード [#q4ba9311]
#code{{
JTableHeader header = new JTableHeader(table.getColumnModel()) {
  public String getToolTipText(MouseEvent e) {
    int c = columnAtPoint(e.getPoint());
    return getTable().getColumnName(c)
      +"################################";
* サンプルコード [#sourcecode]
#code(link){{
JTable table = new JTable(model);
table.setTableHeader(new JTableHeader(table.getColumnModel()) {
  @Override public String getToolTipText(MouseEvent e) {
    int i = columnAtPoint(e.getPoint());
    TableColumn c = getColumnModel().getColumn(i);
    return String.format("%s (width=%dpx)", c.getHeaderValue(), c.getWidth());
  }
};
table.setTableHeader(header);
});
}}

**解説 [#uf43d271]
上記のサンプルでは、JTableHeader#getToolTipTextメソッドをオーバーライドして、マウスカーソルの下にあるカラムヘッダの名前などをTooltipsとして返すようにしています。
* 解説 [#explanation]
- `JTableHeader#getToolTipText(MouseEvent)`メソッドをオーバーライドしてマウスカーソルの下にあるカラムヘッダを取得
-- その名前とその幅を`TooltipsText`として使用

//**参考リンク
**コメント [#k6fbca52]
- 文字列がクリップされている場合だけ、ToolTipを表示する -- [[terai]] &new{2009-10-07 (水) 01:00:19};
#code{{
//HeaderToolTips.java
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.table.*;
public class HeaderToolTips {
  public JComponent makeUI() {
    String[] columnNames = {"StringStringStringString", "Integer", "Boolean"};
    Object[][] data = {
      {"AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA", 12, true},
      {"CCC", 92, true}, {"DDD", 0, false}
    };
    DefaultTableModel model = new DefaultTableModel(data, columnNames) {
      @Override public Class<?> getColumnClass(int column) {
        return getValueAt(0, column).getClass();
      }
    };
    JTable table  = new JTable(model);
    table.setAutoCreateRowSorter(true);
    JTableHeader h = table.getTableHeader();
    h.setDefaultRenderer(new HeaderRenderer(h.getDefaultRenderer()));
    JPanel p = new JPanel(new BorderLayout());
    p.add(new JScrollPane(table));
    p.setPreferredSize(new Dimension(320, 240));
    return p;
  }
  static class HeaderRenderer implements TableCellRenderer {
    private final TableCellRenderer renderer;
    private final Icon icon = UIManager.getIcon("Table.ascendingSortIcon");
    public HeaderRenderer(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().size()>0
                      && 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;
    }
  }
  public static void main(String[] args) {
    EventQueue.invokeLater(new Runnable() {
      public void run() { createAndShowGUI(); }
    });
  }
  public static void createAndShowGUI() {
    JFrame f = new JFrame();
    f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    f.getContentPane().add(new HeaderToolTips().makeUI());
    f.pack();
    f.setLocationRelativeTo(null);
    f.setVisible(true);
  }
}
}}
* 参考リンク [#reference]
- [https://docs.oracle.com/javase/jp/8/docs/api/javax/swing/table/JTableHeader.html#getToolTipText-java.awt.event.MouseEvent- JTableHeader#getToolTipText() (Java Platform SE 8)]
- [[JTableのTooltipsを行ごとに変更>Swing/RowTooltips]]
- [[JTableのセルがクリップされている場合のみJToolTipを表示>Swing/ClippedCellTooltips]]

* コメント [#comment]
#comment
- 文字列がクリップされている場合だけ`JToolTip`を表示する -- &user(aterai); &new{2009-10-07 (水) 01:00:19};
-- [[JTableのセルがクリップされている場合のみJToolTipを表示>Swing/ClippedCellTooltips]]に移動 -- &user(aterai); &new{2009-10-12 (月) 17:43:41};

#comment