code: /*
   * Copyright (c) 1995, 2008, Oracle and/or its affiliates. All rights reserved.
   *
   * Redistribution and use in source and binary forms, with or without
   * modification, are permitted provided that the following conditions
   * are met:
   *
   *   - Redistributions of source code must retain the above copyright
   *     notice, this list of conditions and the following disclaimer.
   *
   *   - Redistributions in binary form must reproduce the above copyright
   *     notice, this list of conditions and the following disclaimer in the
   *     documentation and/or other materials provided with the distribution.
   *
   *   - Neither the name of Oracle or the names of its
   *     contributors may be used to endorse or promote products derived
   *     from this software without specific prior written permission.
   *
   * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS
   * IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
   * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
   * PURPOSE ARE DISCLAIMED.  IN NO EVENT SHALL THE COPYRIGHT OWNER OR
   * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL,
   * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO,
   * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR
   * PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF
   * LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
   * NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS
   * SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
   */ 
  
  package TournamentSystem.tools;
  
  /* 
   * TableToolTipsDemo.java requires no other files.
   */
   
  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;
  
  /** 
   * TableToolTipsDemo is just like TableDemo except that it
   * sets up tool tips for both cells and column headers.
   */
  public class TableToolTipsDemo extends JPanel {
      private boolean DEBUG = false;
      protected String[] columnToolTips = {null,
                                           null,
                                           "The person's favorite sport to participate in",
                                           "The number of years the person has played the sport",
                                           "If checked, the person eats no meat"};
  
      public TableToolTipsDemo() {
          super(new GridLayout(1,0));
  
          JTable table = new JTable(new MyTableModel()) {
              
              //Implement table cell tool tips.
              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 = "This person's favorite sport to "
                             + "participate in is: "
                             + 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 { 
                      //You can omit this part if you know you don't 
                      //have any renderers that supply their own tool 
                      //tips.
                      tip = super.getToolTipText(e);
                  }
                  return tip;
              }
  
              //Implement table header tool tips. 
              protected JTableHeader createDefaultTableHeader() {
                  return new JTableHeader(columnModel) {
                      public String getToolTipText(MouseEvent e) {
                          String tip = null;
                          java.awt.Point p = e.getPoint();
                          int index = columnModel.getColumnIndexAtX(p.x);
                          int realIndex = columnModel.getColumn(index).getModelIndex();
                          return columnToolTips[realIndex];
                      }
                  };
              }
          };
       
          table.setPreferredScrollableViewportSize(new Dimension(500, 70));
          table.setFillsViewportHeight(true);
                  
          //Create the scroll pane and add the table to it.
          JScrollPane scrollPane = new JScrollPane(table);
  
          //Add the scroll pane to this panel.
          add(scrollPane);
      }
  
      class MyTableModel extends AbstractTableModel {
          private String[] columnNames = {"First Name",
                                          "Last Name",
                                          "Sport",
                                          "# of Years",
                                          "Vegetarian"};
          private Object[][] data = {
  	    {"Kathy", "Smith",
  	     "Snowboarding", new Integer(5), new Boolean(false)},
  	    {"John", "Doe",
  	     "Rowing", new Integer(3), new Boolean(true)},
  	    {"Sue", "Black",
  	     "Knitting", new Integer(2), new Boolean(false)},
  	    {"Jane", "White",
  	     "Speed reading", new Integer(20), new Boolean(true)},
  	    {"Joe", "Brown",
  	     "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();
          }
  
          /*
           * Don't need to implement this method unless your table's
           * editable.
           */
          public boolean isCellEditable(int row, int col) {
              //Note that the data/cell address is constant,
              //no matter where the cell appears onscreen.
              if (col < 2) {
                  return false;
              } else {
                  return true;
              }
          }
  
          /*
           * Don't need to implement this method unless your table's
           * data can change.
           */
          public void setValueAt(Object value, int row, int col) {
              if (DEBUG) {
                  System.out.println("Setting value at " + row + "," + col
                                     + " to " + value
                                     + " (an instance of "
                                     + value.getClass() + ")");
              }
  
              data[row][col] = value;
              fireTableCellUpdated(row, col);
  
              if (DEBUG) {
                  System.out.println("New value of data:");
                  printDebugData();
              }
          }
  
          private void printDebugData() {
              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();
              }
              System.out.println("--------------------------");
          }
      } // class MyTableModel
  
      /**
       * Create the GUI and show it.  For thread safety,
       * this method should be invoked from the
       * event-dispatching thread.
       */
      private static void createAndShowGUI() {
          //Create and set up the window.
          JFrame frame = new JFrame("TableToolTipsDemo");
          frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  
          //Create and set up the content pane.
          JComponent newContentPane = new TableToolTipsDemo();
          newContentPane.setOpaque(true); //content panes must be opaque
          frame.setContentPane(newContentPane);
  
          //Display the window.
          frame.pack();
          frame.setVisible(true);
      }
  
      public static void main(String[] args) {
          //Schedule a job for the event-dispatching thread:
          //creating and showing this application's GUI.
          javax.swing.SwingUtilities.invokeLater(new Runnable() {
              public void run() {
                  createAndShowGUI();
              }
          });
      }
  }
  