Java JTable上的JToolTip-未显示

Java JTable上的JToolTip-未显示,java,swing,jtable,jtooltip,Java,Swing,Jtable,Jtooltip,我试图在JTable上实现JToolTip,但是遇到了一些问题。我在以下链接中找到了oracle的示例: 公共类测试扩展了JPanel{ 私有布尔调试=false; 受保护的字符串[]列工具提示={null, 无效的 “个人最喜欢参加的运动”, “该人从事该项运动的年数”, “如果勾选,则该人不吃肉”}; 公开考试(){ 超级(新网格布局(1,0)); JTable table=新的JTable(新的MyTableModel()){ //实现表格单元工具提示。 公共字符串getToolTipT

我试图在JTable上实现JToolTip,但是遇到了一些问题。我在以下链接中找到了oracle的示例:

公共类测试扩展了JPanel{
私有布尔调试=false;
受保护的字符串[]列工具提示={null,
无效的
“个人最喜欢参加的运动”,
“该人从事该项运动的年数”,
“如果勾选,则该人不吃肉”};
公开考试(){
超级(新网格布局(1,0));
JTable table=新的JTable(新的MyTableModel()){
//实现表格单元工具提示。
公共字符串getToolTipText(MouseEvent e){
字符串提示=null;
java.awt.Point p=e.getPoint();
int ROWDINDEX=行点(p);
int colIndex=柱状点(p);
int realColumnIndex=convertColumnIndexToModel(colIndex);
如果(realcolumnidex==2){//Sport column
tip=“此人最喜欢的运动”
+“参与is:”
+getValueAt(行索引,共索引);
}else如果(realcolumnidex==4){//Veggie列
TableModel模型=getModel();
String firstName=(String)model.getValueAt(rowIndex,0);
String lastName=(String)model.getValueAt(rowIndex,1);
布尔vegie=(布尔)model.getValueAt(rowIndex,4);
if(布尔值。真值。等于(素食)){
提示=firstName+“”+lastName
+“是素食者”;
}否则{
提示=firstName+“”+lastName
+“不是素食者”;
}
}否则{
//如果你不知道的话,你可以省略这一部分
//有没有提供自己工具的渲染器
//提示。
tip=super.gettooltipext(e);
}
返回端;
}
//实现表格标题工具提示。
受保护的JTableHeader createDefaultTableHeader(){
返回新的JTableHeader(columnModel){
公共字符串getToolTipText(MouseEvent e){
字符串提示=null;
java.awt.Point p=e.getPoint();
int index=columnModel.getColumnIndexAX(p.x);
int realIndex=columnModel.getColumn(index.getModelIndex();
返回列工具提示[realIndex];
}
};
}
};
表.setPreferredScrollableViewportSize(新维度(500,70));
表.setFillsViewPerthweight(真);
//创建滚动窗格并将表添加到其中。
JScrollPane scrollPane=新的JScrollPane(表);
//将滚动窗格添加到此面板。
添加(滚动窗格);
}
类MyTableModel扩展了AbstractTableModel{
私有字符串[]columnNames={“名字”,
“姓氏”,
“运动”,
“#年”,
“素食者”};
私有对象[][]数据={
{“凯西”,“史密斯”,
“滑雪板”,新整数(5),新布尔值(假)},
{“约翰”,“多伊”,
“划船”,新整数(3),新布尔值(真)},
{“苏”,“黑”,
“编织”,新整数(2),新布尔值(假)},
{“简”、“白”,
“快速读取”,新整数(20),新布尔值(真)},
{“乔”,“布朗”,
“Pool”、新整数(10)、新布尔值(false)}
};
public int getColumnCount(){
返回columnNames.length;
}
public int getRowCount(){
返回数据长度;
}
公共字符串getColumnName(int-col){
返回列名[col];
}
公共对象getValueAt(整数行,整数列){
返回数据[行][col];
}
/*
*JTable使用此方法确定默认渲染器/
*每个单元格的编辑器。如果我们没有实现此方法,
*最后一列将包含文本(“真”/“假”),
*而不是复选框。
*/
公共类getColumnClass(int c){
返回getValueAt(0,c).getClass();
}
/*
*不需要实现此方法,除非您的表
*可编辑。
*/
公共布尔值可编辑(int行,int列){
//请注意,数据/单元地址是恒定的,
//无论单元格出现在屏幕上的何处。
if(col<2){
返回false;
}否则{
返回true;
}
}
/*
*不需要实现此方法,除非您的表
*数据可以改变。
*/
public void setValueAt(对象值、整行、整列){
如果(调试){
System.out.println(“设置值在“+行+”,“+列
+“至”+价值
+“(一个例子)
+value.getClass()+”);
}
数据[行][列]=值;
FireTableCell更新(行、列);
如果(调试){
System.out.println(“数据的新值:”);
printDebugData();
}
}
私有void printDebugData(){
int numRows=getRowCount();
int numCols=getColumnCount();
用于(int i)=
public class test 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 test() {
        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("--------------------------");
        }
    }

    /**
     * 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 test();
        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();
            }
        });
    }
}
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"};
 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 new JTableHeader(columnModel) {
            public String getToolTipText(MouseEvent e) {
                String tip = null;
                java.awt.Point p = e.getPoint();
                //System.out.println(p);
                int index = columnModel.getColumnIndexAtX(p.x);
                int realIndex = columnModel.getColumn(index).getModelIndex();
                return columnToolTips[realIndex];
            }
        };