5

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

4 回答 4

4

hideTipAction 的 isEnabled() 属性似乎直接与 tipShowing 布尔值相关联。你可以试试这个:

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

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

编辑,您的回复:

缺少一些丑陋的反射代码,我认为您别无选择。ToolTipManager由于包私有构造函数,您不能子类化,并且showTipWindow()andhideTipWindow()也是包私有的,因此适配器模式也被淘汰了。

于 2008-12-01T17:19:55.133 回答
1

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

于 2008-12-01T17:35:42.933 回答
1

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

于 2008-12-01T20:27:18.187 回答
1

既然你已经有了自己的 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;
}
于 2008-12-01T21:19:58.457 回答