0

我有一个表,其中一列包含 JPanel。我已经编写了自定义渲染器和编辑器,它们工作正常。但是,该面板包含一个带有工具提示的 JLabel 组件。如果我单击单元格并将鼠标悬停在标签上,则会显示工具提示,但如果我将鼠标移入单元格并将鼠标悬停在 JLabel 上,则不会显示工具提示。我在表格中添加了一个鼠标侦听器,如下所示,我在其中获取 Panel 对象并尝试使其具有焦点。

public void mouseMoved(MouseEvent e) {
    Point p = e.getPoint();
    int row = table.rowAtPoint(p);
    int column = table.columnAtPoint(p);
    System.out.println(row + " " + column);
    Object o = table.getModel().getValueAt(row, column);
    if (o instanceof FileInfoCellPanel) {
        FileInfoCellPanel ficp = (FileInfoCellPanel)o;
        ficp.requestFocusInWindow();
        //ficp.revalidate();
    }
}

我肯定得到了正确的 JPanel 对象,但它似乎从来没有得到关注。因此,单击单元格似乎将焦点集中在面板上,但移动鼠标却没有。

4

1 回答 1

2

如果您只想在工具提示中显示文本,则在渲染器返回的组件上设置工具提示就足够了。JTable#getTooltipText如果您查看我在下面复制的方法的实现,就可以看到这一点

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

        // Now have to see if the component is a JComponent before
        // getting the tip
        if (component instanceof JComponent) {
            // Convert the event to the renderer's coordinate system
            Rectangle cellRect = getCellRect(hitRowIndex, hitColumnIndex, false);
            p.translate(-cellRect.x, -cellRect.y);
            MouseEvent newEvent = new MouseEvent(component, event.getID(),
                                      event.getWhen(), event.getModifiers(),
                                      p.x, p.y,
                                      event.getXOnScreen(),
                                      event.getYOnScreen(),
                                      event.getClickCount(),
                                      event.isPopupTrigger(),
                                      MouseEvent.NOBUTTON);

            tip = ((JComponent)component).getToolTipText(newEvent);
        }
    }

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

    return tip;
}

可以看出,为了确定工具提示文本,渲染器被要求提供一个组件,并且该组件被要求提供它的工具提示文本。当然这仅适用于文本而不适用于例如图像

于 2012-05-04T19:55:01.903 回答