TITLE:JTableHeaderのTooltipsを列ごとに変更
Posted by terai at 2005-05-23

JTableHeaderのTooltipsを列ごとに変更

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

概要

JTableHeaderTooltipsがカーソルのある列の内容などを表示するようにします。

#screenshot

サンプルコード

#spanend
#spandel
JTableHeader header = new JTableHeader(table.getColumnModel()) {
#spanend
  public String getToolTipText(MouseEvent e) {
    int c = columnAtPoint(e.getPoint());
    return getTable().getColumnName(c)
      +"################################";
#spanadd
* サンプルコード [#sourcecode]
#spanend
#spanadd
#code(link){{
#spanend
#spanadd
JTable table = new JTable(model);
#spanend
#spanadd
table.setTableHeader(new JTableHeader(table.getColumnModel()) {
#spanend
  @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());
  }
#spandel
};
#spanend
#spandel
table.setTableHeader(header);
#spanend
#spanadd
});
#spanend

解説

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

解説

  • JTableHeader#getToolTipText(MouseEvent)メソッドをオーバーライドしてマウスカーソルの下にあるカラムヘッダを取得
    • その名前とその幅をTooltipsTextとして使用

コメント

  • 文字列がクリップされている場合だけ、ToolTipを表示する -- terai
    #spanend
    #spandel
    //HeaderToolTips.java
    #spanend
    #spandel
    import java.awt.*;
    #spanend
    #spandel
    import java.awt.event.*;
    #spanend
    #spandel
    import javax.swing.*;
    #spanend
    #spandel
    import javax.swing.table.*;
    #spanend
    #spandel
    public class HeaderToolTips {
    #spanend
      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);
      }
    #spandel
    }
    #spanend
    #spandel
    

参考リンク

コメント