Swing可以告诉我是否有活动的工具提示?

时间:2008-12-01 17:09:38

标签: java swing tooltip

在Swing中是否有一种优雅的方式来确定我的框架中是否有任何工具提示显示?

我正在使用自定义工具提示,因此在我的createToolTip()方法中设置标记非常容易,但我找不到找出工具提示何时消失的方法。

ToolTipManager有一个很好的标志,tipShowing,但当然它是private,他们似乎没有提供达到它的方法。 hideWindow()没有调用工具提示组件(我可以告诉),所以我看不到那里的方法。

有人有什么好主意吗?

更新:我带着反思。你可以在这里看到代码:

private boolean isToolTipVisible() {
    // Going to do some nasty reflection to get at this private field.  Don't try this at home!
    ToolTipManager ttManager = ToolTipManager.sharedInstance();
    try {
        Field f = ttManager.getClass().getDeclaredField("tipShowing");
        f.setAccessible(true);

        boolean tipShowing = f.getBoolean(ttManager);

        return tipShowing;

    } catch (Exception e) {
        // We'll keep silent about this for now, but obviously we don't want to hit this
        // e.printStackTrace();
        return false;
    }
}

4 个答案:

答案 0 :(得分:3)

似乎hideTipAction的isEnabled()属性直接绑定到tipShowing布尔值。你可以试试这个:

public boolean isTooltipShowing(JComponent component) {
    AbstractAction hideTipAction = (AbstractAction) component.getActionMap().get("hideTip");
    return hideTipAction.isEnabled();
 }

你可能想对空值等进行一些健全性检查。但是这应该让你非常接近。

编辑,回复:

缺少一些丑陋的反思代码,我认为你没有太多选择。由于包私有构造函数,您不能继承ToolTipManagershowTipWindow()hideTipWindow()也是包私有的,因此适配器模式也不存在。

答案 1 :(得分:0)

看起来这需要在所有组件上循环以查看它们是否有工具提示。我在寻找全球价值。可能循环是可行的,但似乎效率低下。

答案 2 :(得分:0)

太糟糕了。经过内部讨论后,“丑陋的反思”也是我们想出来的,但我希望那里有人有更好的主意。

答案 3 :(得分:0)

既然你已经拥有了自己的createToolTip(),也许你可以试试这样的东西:)

public JToolTip createToolTip() {
  JToolTip tip = super.createToolTip();
  tip.addAncestorListener( new AncestorListener() {
    public void ancestorAdded( AncestorEvent event ) {
      System.out.println( "I'm Visible!..." );
    }

    public void ancestorRemoved( AncestorEvent event ) {
      System.out.println( "...now I'm not." );
    }

    public void ancestorMoved( AncestorEvent event ) { 
      // ignore
    }
  } );
  return tip;
}