JTable中的JPanel专注于鼠标点击而不是鼠标悬停

时间:2012-05-04 18:33:53

标签: java swing jtable mouselistener

我有一个包含JPanels列的表。我编写了自定义渲染器和编辑器,它们工作正常。但是,面板包含带有工具提示的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对象,但它似乎永远不会得到焦点。因此,单击单元格似乎会将焦点放在面板上,但移动鼠标则不会。

1 个答案:

答案 0 :(得分: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;
}

可以看出,要确定工具提示文本,请求渲染器提供组件,并要求该组件提供其工具提示文本。当然这仅适用于文本而不适用于例如文本。图像