Java中的JTable中的JTooltip在单击时不会选择该行

时间:2013-08-20 02:37:55

标签: java macos swing jtable tooltip

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

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

代码:

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

* *更新: 在进一步调查中,问题似乎与此bug report类似。基本上,ToolTipManager.showTipWindow()将工具提示创建为Mac上的HeavyWeight组件和Windows上的LightWeight组件,然后导致不会触发mouselistener。更糟糕的是,无论你将popupType设置为轻量级,当Java代码调用popupFactory.getPopup(...)

时,它仍将在该方法中将其创建为重量级组件

2 个答案:

答案 0 :(得分:1)

不知道如何修复它。

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

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

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

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

答案 1 :(得分:1)

点击工具提示不会在JTable上生成MouseEvent的原因是因为工具提示是以HEAVY_WEIGHT_POPUP而不是LIGHT_WEIGHT_POPUP生成的。

这可能是由于多种原因造成的,即使像L& F这样简单的事情也是如此。

它在Java Swing中的工作方式是PopupFactory将创建工具提示。 In Java mixing HeavyWeight and LightWeight component can have some ramifications因此围绕Java 5-6(不确定是哪种)Java语言添加了定义此属性的能力,但是一些L& F库不使用它或正确地遵守它。如果您使用的是旧版本,则可能无法实现。有关此切换需要的详细信息,您可以在将切换添加到Swing之前阅读以下bug report

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