在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(...)
时,它仍将在该方法中将其创建为重量级组件答案 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。