Может ли Swing сказать мне, есть ли активная всплывающая подсказка?

Есть ли в 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;
    }
}

person David Irwin    schedule 01.12.2008    source источник


Ответы (4)


Похоже, что свойство isEnabled () свойства hideTipAction напрямую связано с логическим значением tipShowing. Вы можете попробовать это:

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

Вы, вероятно, захотите выполнить некоторую проверку на наличие нулей и т. Д. Но это должно вас довольно близко подвести.

ИЗМЕНИТЬ, к вашим ответам:

Если не считать уродливого кода отражения, я не думаю, что у вас есть большой выбор. Вы не можете создать подкласс ToolTipManager из-за частного конструктора пакета, а showTipWindow() и hideTipWindow() также являются частными пакетами, поэтому шаблон адаптера также отсутствует.

person James Van Huis    schedule 01.12.2008

Похоже, что для этого потребуется перебрать все компоненты, чтобы увидеть, есть ли у них всплывающая подсказка. Я ищу глобальную ценность. Может случиться так, что цикл выполним, но он кажется неэффективным.

person David Irwin    schedule 01.12.2008

Это очень плохо. После внутреннего обсуждения мы также пришли к выводу, что "уродливое отражение", но я надеялся, что у кого-то есть идея получше.

person David Irwin    schedule 01.12.2008

Поскольку у вас уже есть собственный 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;
}
person Community    schedule 01.12.2008