0

在 Windows 上,如果您单击表格工具提示 (JToolTip),它将删除工具提示并选择表格中的行。但是在 Mac 上,它似乎只是删除了工具提示而不选择表中的行。

该代码仅使用标准 JTable 并覆盖 JTable 中的 getToolTipText 方法。没有创建自定义 JToolTip 或类似的东西。

代码:

public class MyJTable extends JTable
{
    @Override
    public String getToolTipText(MouseEvent event)
    {
        return "Hello world";
    }
}

* *更新: 进一步调查该问题似乎是由于类似于此错误报告的原因。基本上 ToolTipManager.showTipWindow() 将工具提示创建为 Mac 上的 HeavyWeight 组件和 Windows 上的 LightWeight 组件,然后导致鼠标侦听器不被触发。更糟糕的是,无论您是否将 popupType 设置为轻量级,当 Java 代码调用 popupFactory.getPopup(...)

4

2 回答 2

1

单击 ToolTip 不会在 JTable 上生成 MouseEvent 的原因是因为 ToolTip 生成为 aHEAVY_WEIGHT_POPUP而不是 a LIGHT_WEIGHT_POPUP

这可能是由于多种原因,甚至像 L&F 这样简单的原因。

它在 Java Swing 中的工作方式是PopupFactory创建 ToolTip。在 Java 中混合 HeavyWeight 和 LightWeight 组件可能会产生一些影响,因此在 Java 5-6(不确定是哪个)中,Java 语言添加了定义此属性的能力,但是一些 L&F 库不使用它或正确遵守它. 而且,如果您使用的是旧版本,那可能就不可能了。有关此切换需要的更多详细信息,您可以在将切换添加到 Swing 之前阅读以下错误报告。

在任何情况下,如果组件(在本例中为 ToolTip)是 HEAVY_WEIGHT_POPUP,则 MouseEvent 不会传播到 JTable,因此只有 ToolTip 会消失,并且不会选择表中的行。ToolTip 需要是 LIGHT_WEIGHT_POPUP 才能让 MouseEvent 传播到 JTable。

于 2013-08-20T06:35:09.780 回答
1

不知道如何解决它。

通常为每一行或单元格而不是整个表格提供不同的工具提示。因此,当您移动鼠标时,工具提示会发生变化并显示在不同的位置,因此您永远没有机会实际单击工具提示。

因此,也许作为一种替代方法,您也可以覆盖该getToolTipLocation()方法:

public Point getToolTipLocation(MouseEvent e)
{
    return new Point(e.getX(), e.getY() + 10);
}

现在用户将永远无法点击它。

于 2013-08-20T03:49:19.070 回答