JTable中JPanel中的工具提示不起作用

时间:2012-06-01 17:29:23

标签: java swing jtable tooltip

我有JTable。一列包含JPanel,其中包含一些JLabelsImageIcons。我创建了一个自定义单元格渲染,除JLabel上的工具提示外,所有工作都很好。当我将鼠标悬停在JLabels中的任何一个上时,我需要显示该特定Tooltip的{​​{1}}。它没有显示JLabel的脚印。

这是JLabel

CustomRenderer

1 个答案:

答案 0 :(得分:10)

问题是您在CellRenderer返回的组件的子组件上设置工具提示。要执行您想要的操作,您应该考虑在JTable上覆盖getToolTipText(MouseEvent e)。从事件中,您可以使用以下命令找到鼠标所在的行和列:

java.awt.Point p = e.getPoint();
int rowIndex = rowAtPoint(p);
int colIndex = columnAtPoint(p);

然后,您可以从那里重新准备单元格渲染器,找到位于鼠标位置的组件并最终检索其工具提示。

以下是如何覆盖JTable getToolTipText的片段:

@Override
public String getToolTipText(MouseEvent event) {
    String tip = null;
    Point p = event.getPoint();

    // Locate the renderer under the event location
    int hitColumnIndex = columnAtPoint(p);
    int hitRowIndex = rowAtPoint(p);

    if (hitColumnIndex != -1 && hitRowIndex != -1) {
        TableCellRenderer renderer = getCellRenderer(hitRowIndex, hitColumnIndex);
        Component component = prepareRenderer(renderer, hitRowIndex, hitColumnIndex);
        Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
        component.setBounds(cellRect);
        component.validate();
        component.doLayout();
        p.translate(-cellRect.x, -cellRect.y);
        Component comp = component.getComponentAt(p);
        if (comp instanceof JComponent) {
            return ((JComponent) comp).getToolTipText();
        }
    }

    // No tip from the renderer get our own tip
    if (tip == null) {
        tip = getToolTipText();
    }

    return tip;
}