JTable 每列的工具提示文本 header

Tooltip text for each column of a JTable header

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

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

我看过 this question,但无法理解当 TableCellRenderer 中的唯一方法是 getTableCellRendererComponent.

时如何覆盖 getToolTipText

我发现唯一 class 有此 getToolTipText 的是 JComponent

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

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

Windows table header 不同于 MAC table header 不同于 Nimbus table header.

is it saying to create my own TableHeader?

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

Would I still be able to use the text under the mouse as the tooltip?

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

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

那么,我怎样才能获得第 header 列的工具提示,而无需每次都创建一个新的 JTable 并且不会造成混乱? JTable 初始化中的关键代码覆盖了 JTable "protected JTableHeader createDefaultTableHeader()" 中的一个方法,这当然允许 table header (JTableHeader) 带有工具提示。 JTableHeader 是我真正想要处理的。

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

(我将此作为答案发布,因为它太复杂了,无法发表评论,但可能对其他人有用)

这是我更新 table-

时我的 GUI class 中的代码
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-

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];
    }
}