Может ли Swing сказать мне, есть ли активная подсказка? - PullRequest
3 голосов
/ 01 декабря 2008

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

3 голосов
/ 01 декабря 2008

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

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

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

РЕДАКТИРОВАТЬ, к вашим ответам:

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

0 голосов
/ 02 декабря 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;
}
0 голосов
/ 01 декабря 2008

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

0 голосов
/ 01 декабря 2008

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

...