TITLE:JTableHeaderのTooltipsを列ごとに変更

Posted by terai at 2005-05-23

JTableHeaderのTooltipsを列ごとに変更

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

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

#screenshot

サンプルコード

JTableHeader header = new JTableHeader(table.getColumnModel()) {
  public String getToolTipText(MouseEvent e) {
    int c = columnAtPoint(e.getPoint());
    return getTable().getColumnName(c)
      +"################################";
  }
};
table.setTableHeader(header);

解説

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

コメント

  • 文字列がクリップされている場合だけ、ToolTipを表示する -- terai
    //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);
      }
    }