• 追加された行はこの色です。
  • 削除された行はこの色です。
TITLE:JTableHeaderのTooltipsを列ごとに変更
#navi(../)
RIGHT:Posted by [[terai]] at 2005-05-23
RIGHT:Posted by &author(aterai); at 2005-05-23
*JTableHeaderのTooltipsを列ごとに変更 [#k51269f9]
JTableHeaderのTooltipsが、カーソルのある列の内容などを表示するようにします。

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

#screenshot
//#screenshot
#ref(http://lh6.ggpht.com/_9Z4BYR88imo/TQTNx5xm6BI/AAAAAAAAAbU/LCSjxDNp8p0/s800/HeaderTooltips.png)

**サンプルコード [#q4ba9311]
#code{{
#code(link){{
JTableHeader header = new JTableHeader(table.getColumnModel()) {
  public String getToolTipText(MouseEvent e) {
    int c = columnAtPoint(e.getPoint());
    return getTable().getColumnName(c)
      +"################################";
  }
};
table.setTableHeader(header);
}}

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

//**参考リンク
**参考リンク [#p438405b]
-[[JTableのTooltipsを行ごとに変更>Swing/RowTooltips]]
-[[JTableのセルがクリップされている場合のみJToolTipを表示>Swing/ClippedCellTooltips]]

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

#comment