【问题标题】:Tooltip text for each column of a JTable headerJTable 标题每列的工具提示文本
【发布时间】:2015-10-13 03:14:22
【问题描述】:

当您将鼠标悬停在该单元格上时,我正在尝试将标题的每个单元格中的文本显示为工具提示。

我发现您可以为整个标题设置工具提示:table.getTableHeader().setToolTipText("asdf");,但不能对每个单元格进行类似操作,例如:table.getTableHeader().getColumnModel().getColumn(0).setToolTipText("asdf");

我查看了this question,但无法理解当 TableCellRenderer 中的唯一方法是 getTableCellRendererComponent 时如何覆盖 getToolTipText

我发现拥有这个 getToolTipText 的唯一类是 JComponent

【问题讨论】:

  • getTableCellRendererComponent 返回 Component,这是您要在 getTableCellRendererComponent 方法中设置工具提示的组件
  • 对于exampleexample
  • @MadProgrammer 第二个链接是完美的,谢谢!如果您快速写下答案,我会接受。谢谢:)
  • 如果它解决了您的问题,我将其标记为重复问题;)
  • 参见 Specifying Tooltips For Column Headers 上的 Swing 教程部分。我会推荐这种方法,因为每个 LAF 都可以有自己的自定义渲染器,因此扩展默认渲染器不适用于所有 LAF。

标签: java swing jtable tooltip


【解决方案1】:

请参阅 Specifying Tooltips For Column Headers 上的 Swing 教程部分。

我会推荐这种方法,因为每个 LAF 都可以有自己的自定义渲染器,因此扩展默认渲染器不适用于所有 LAF。

Windows 表头不同于 MAC 表头,MAC 表头不同于 Nimbus 表头。

是说要创建我自己的 TableHeader 吗?

它覆盖了创建 JTableHeader 的代码,因此您可以覆盖 JTableHeader 的 getToolTipText(MouseEvent) 方法,以便您可以根据鼠标位置提供自己的工具提示。示例代码只是从数组中获取工具提示。

我仍然可以使用鼠标下的文本作为工具提示吗?

如果你想要标题的文本,你需要从JTableHeader中获取TableColumnModel,然后获取TableColumn,然后使用getHeaderValue()获取列标题的文本。

【讨论】:

    【解决方案2】:

    我遇到了这个,因为它与我需要的相似 - 我想为列标题添加工具提示。 camickr 链接的 Oracle 演示示例通过 JTable 创建中的附加代码启用了工具提示。该示例将我引向了正确的方向,并且我得到了类似的工作方式,但这样做的方式是在每次更新表时初始化一个新的 JTable。之前,我只是使用 myJTable.setModel() 来更新表格。此外,Oracle 示例看起来很混乱,而且有点混乱。我不需要扩展 AbstractTableModel,因为它看起来根本不会影响工具提示。

    那么,我怎样才能获得列标题工具提示,而无需每次都创建一个新的 JTable 并且不会弄得一团糟? JTable 初始化中的关键代码是覆盖 JTable“受保护的 JTableHeader createDefaultTableHeader()”中的一个方法,该方法当然允许带有工具提示的表头 (JTableHeader)。 JTableHeader 是我真正想做的工作。

    我所做的是我创建了一个扩展 JTableHeader 的新类,以便它在构造函数中包含一个工具提示字符串数组和一个 getToolTipText() 方法(与示例相同,但没有字符串提示),然后我做了 myJTable .setTableHeader() 将其设置为具有工具提示字符串数组的新类的实例。

    (我将其发布为答案,因为它涉及太多评论,但可能对其他人有用)

    这是我更新表格时 GUI 类中的代码-

    myJTable.setModel(new javax.swing.table.DefaultTableModel(
                tableData,
                colHeader
            ));//setting the new data and col headers! (no tooltips yet)
    
    MyTableHeader headerWithTooltips = new MyTableHeader(myJTable.getColumnModel(), colHeaderTooltips);//make a new header that allows for tooltips
    myJTable.setTableHeader(headerWithTooltips);//use that header in my table
    

    这是我的 MyTableHeader 类-

    class MyTableHeader extends JTableHeader {
    
        String[] tooltips;
    
        MyTableHeader(TableColumnModel columnModel, String[] columnTooltips) {
          super(columnModel);//do everything a normal JTableHeader does
          this.tooltips = columnTooltips;//plus extra data
        }
    
        public String getToolTipText(MouseEvent e) {
            java.awt.Point p = e.getPoint();
            int index = columnModel.getColumnIndexAtX(p.x);
            int realIndex = columnModel.getColumn(index).getModelIndex();
            return this.tooltips[realIndex];
        }
    }
    

    【讨论】:

    • I thought it was strange to create a new JTable every time the table is updated. - 无需创建新的 JTable。不知道你从哪里得到这个想法。您要么更新当前模型,要么为表设置新模型。
    • @camickr 好吧,我已经按照示例进行了操作,这就是它在启用工具提示时所做的事情(好吧,它只做了一次,但它无助于弄清楚如何使用新的表格数据和标题调整工具提示)。它是在 JTable 创建中完成的。 --- JTable table = new JTable(new MyTableModel()) { ...我将在上面的答案中改写它。那么我的答案看起来还可以吗?
    • but it didn't help figuring out how to adjust tooltips with new table data and header - 你不需要做任何事情。该代码现在是 JTable 类的一部分,并且会在 TableModel 发生更改时执行。
    猜你喜欢
    • 2015-09-22
    • 2014-10-04
    • 1970-01-01
    • 2016-10-05
    • 1970-01-01
    • 1970-01-01
    • 2012-05-08
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多