如何将工具提示添加到 jtable 中的单元格?

Posted

技术标签:

【中文标题】如何将工具提示添加到 jtable 中的单元格?【英文标题】:How to add a tooltip to a cell in a jtable? 【发布时间】:2012-03-17 01:09:42 【问题描述】:

我有一个表格,其中每一行代表一张图片。在列路径中,我存储了它的绝对路径。字符串有点长,我希望当我将鼠标悬停在特定单元格上时,应在鼠标旁边弹出一个工具提示,其中包含来自单元格的信息。

【问题讨论】:

【参考方案1】:

您说您将绝对路径存储在单元格中。您可能正在使用JLabel 来设置绝对路径字符串。假设你的单元格中有一个标签,使用 html 标签来表达工具提示内容:

JLabel label = new JLabel("Bla bla");
label.setToolTipText("<html><p>information about cell</p></html>");

setToolTipText() 可用于其他一些 Swing 组件,如果您使用的不是 JLabel 的话。

【讨论】:

"deffinetly nope" 我想知道@deporter 是否理解该评论。我当然不会。 :( 请更准确一点:在你的单元格中有一个标签可能会产生误导(单元格中不应该有组件)相反,它是一个由渲染器以及...以及..渲染组件:-) 表示看不懂评论。如果你这样做了,请给我解释一下。否定中指的是什么?什么是“不”?【参考方案2】:

我假设您没有为路径编写自定义CellRenderer,而只是使用DefaultTableCellRenderer。您应该继承DefaultTableCellRenderer 并在getTableCellRendererComponent 中设置工具提示。然后设置列的渲染器。

class PathCellRenderer extends DefaultTableCellRenderer 
    public Component getTableCellRendererComponent(
                        JTable table, Object value,
                        boolean isSelected, boolean hasFocus,
                        int row, int column) 
        JLabel c = (JLabel)super.getTableCellRendererComponent( /* params from above (table, value, isSelected, hasFocus, row, column) */ );
        // This...
        String pathValue = <getYourPathValue>; // Could be value.toString()
        c.setToolTipText(pathValue);
        // ...OR this probably works in your case:
        c.setToolTipText(c.getText());
        return c;
    


...
pathColumn.setCellRenderer(new PathCellRenderer()); // If your path is of specific class (e.g. java.io.File) you could set the renderer for that type
...
Oracle JTable tutorial on tooltips

【讨论】:

你不能调用 super.getTableCellRendererComponent。 @codenamezero 为什么不呢?您知道在示例代码中我将DefaultTableCellRenderer 子类化,它具有非抽象方式的方法,并且本身就是JLabel getTableCellRendererComponent() 方法中有一个参数作为对象值。那么这里的值是什么意思呢?我们放tooltip的是行数据还是列数据 @chamzz.dot 我不确定我是否完全理解您的意图,但我会尝试。渲染器仅用于单个单元格。 DefaultTableCellRenderer 按层次结构的JLable 并被强制转换为此,因此可以使用它的所有方法。 好吧,我的意思是像这个 Hauke Ingmar Schmidt,你传递给 getTableCellRendererComponent 方法的值在这里很重要。这里的第二个参数对象值必须是您的列的值。然后你可以试试JLabel cellComponent = (JLabel) super.getTableCellRendererComponent(table, value, isSelected, hasFocus, row, column); 然后cellComponent.setToolTipText(value.toString());【参考方案3】:

在创建 JTable 对象时使用下面的代码。

JTable auditTable = new JTable()

            //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);

                try 
                    tip = getValueAt(rowIndex, colIndex).toString();
                 catch (RuntimeException e1) 
                    //catch null pointer exception if mouse is over an empty line
                

                return tip;
            
        ;

【讨论】:

其实我觉得比公认的方案效率高。 当我们根据某些列对表格进行排序时,这可能不起作用。 使用 getRowSorter().convertRowIndexToModel(rowIndex)getRowSorter().convertRowIndexToModel(rowIndex) 从模型中获取准确的行。 @NagendraVarma 在示例中,JTable.getValueAt 使用视图索引。仅当您使用模型查找值(即getModel( ).getValueAt)时,才需要模型索引。因此,在编写示例时,它将在对表进行排序或过滤等时起作用。

以上是关于如何将工具提示添加到 jtable 中的单元格?的主要内容,如果未能解决你的问题,请参考以下文章

在jTable(自动保存)中编辑后,如何将单元格中的数据保存在sql中?

如何在JTable的单元格上禁用鼠标单击事件?

在 JTable 的单元格中添加按钮以及数据?

java的swing编程,Jtable的单元格如何赋值

如何为 JTable 中的单元格着色? [复制]

java Jtable 如何动态添加button按钮