Java JTable set tooltip for column header

Description

Java JTable set tooltip for column header

import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTable;
import javax.swing.table.AbstractTableModel;
import javax.swing.table.JTableHeader;
import javax.swing.table.TableModel;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.MouseEvent;

public class Main extends JPanel {
   public Main() {
      super(new GridLayout(1, 0));

      JTable table = new JTable(new MyTableModel());

      table.setPreferredScrollableViewportSize(new Dimension(500, 70));
      table.setFillsViewportHeight(true);

      JScrollPane scrollPane = new JScrollPane(table);

      add(scrollPane);//from  w w w.  java 2s.  c  om
   }

   public static void main(String[] args) {
      JFrame frame = new JFrame("Table ToolTips Demo");
      frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

      JComponent newContentPane = new Main();
      frame.setContentPane(newContentPane);

      frame.pack();
      frame.setVisible(true);
   }
}

class MyJTable extends JTable {
   public String getToolTipText(MouseEvent e) {
      String tip = null;
      java.awt.Point p = e.getPoint();
      int rowIndex = rowAtPoint(p);
      int colIndex = columnAtPoint(p);
      int realColumnIndex = convertColumnIndexToModel(colIndex);

      if (realColumnIndex == 2) { // Sport column
         tip = getValueAt(rowIndex, colIndex)+"";
      } else if (realColumnIndex == 4) { // Veggie column
         TableModel model = getModel();
         String firstName = (String) model.getValueAt(rowIndex, 0);
         String lastName = (String) model.getValueAt(rowIndex, 1);
         Boolean veggie = (Boolean) model.getValueAt(rowIndex, 4);
         if (Boolean.TRUE.equals(veggie)) {
            tip = firstName + " " + lastName + " is a vegetarian";
         } else {
            tip = firstName + " " + lastName + " is not a vegetarian";
         }
      } else {
         tip = super.getToolTipText(e);
      }
      return tip;
   }

   protected JTableHeader createDefaultTableHeader() {
      return new JTableHeader(columnModel) {
         public String getToolTipText(MouseEvent e) {
            java.awt.Point p = e.getPoint();
            int index = columnModel.getColumnIndexAtX(p.x);
            int realIndex = columnModel.getColumn(index).getModelIndex();
            return index + " " + realIndex;
         }
      };
   }

}

class MyTableModel extends AbstractTableModel {
   private String[] columnNames = { "First Name", "Last Name", "Sport", "# of Years", "Vegetarian" };
   private Object[][] data = { 
         { "A", "A", "Snowboarding", new Integer(5), new Boolean(false) },//
         { "B", "B", "Rowing", new Integer(3), new Boolean(true) },//
         { "C", "C", "Knitting", new Integer(2), new Boolean(false) },//
         { "D", "D", "Speed reading", new Integer(20), new Boolean(true) },//
         { "E", "E", "Pool", new Integer(10), new Boolean(false) } };

   public int getColumnCount() {
      return columnNames.length;
   }

   public int getRowCount() {
      return data.length;
   }

   public String getColumnName(int col) {
      return columnNames[col];
   }

   public Object getValueAt(int row, int col) {
      return data[row][col];
   }

   /*
    * JTable uses this method to determine the default renderer/ editor for each
    * cell. If we didn't implement this method, then the last column would contain
    * text ("true"/"false"), rather than a check box.
    */
   public Class getColumnClass(int c) {
      return getValueAt(0, c).getClass();
   }
   public boolean isCellEditable(int row, int col) {
      if (col < 2) {
         return false;
      } else {
         return true;
      }
   }

   public void setValueAt(Object value, int row, int col) {
      System.out.println("Setting value at " + row + "," + col + " to " + value + " (an instance of " + value.getClass() + ")");
      data[row][col] = value;
      fireTableCellUpdated(row, col);
      System.out.println("New value of data:");

      int numRows = getRowCount();
      int numCols = getColumnCount();

      for (int i = 0; i < numRows; i++) {
         System.out.print("    row " + i + ":");
         for (int j = 0; j < numCols; j++) {
            System.out.print("  " + data[i][j]);
         }
         System.out.println();
      }
   }
}



PreviousNext

Related