Pergunta

Existe uma maneira elegantish em Swing para descobrir se existem dicas atualmente sendo exibida no meu quadro?

Eu estou usando dicas de ferramentas personalizadas, por isso seria muito fácil de configurar uma bandeira no meu método createToolTip(), mas eu não posso ver uma maneira de descobrir quando a dica de ferramenta está desaparecido.

ToolTipManager tem uma bandeira agradável para isso, tipShowing, mas é claro que é private e eles não parecem oferecer uma maneira de chegar a ele. hideWindow() não chama para o componente dica (que eu posso dizer), então eu não vejo um caminho.

Alguém tem alguma boa idéia?

Update: Eu fui com reflexão. Você pode ver o código aqui:

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;
    }
}
Foi útil?

Solução

Parece que a propriedade isEnabled () do hideTipAction está diretamente ligada ao boolean tipShowing. Você poderia tentar o seguinte:

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

Você provavelmente quer fazer alguma sanidade a verificação de nulos, etc. Mas isso deve chegar muito perto.

EDIT, para suas respostas:

curta de algum código reflexão feio, eu não acho que você tem muita escolha. Você pode ToolTipManager não subclasse por causa do construtor privado pacote, eo showTipWindow() e hideTipWindow() são também pacote privado, de modo que o padrão Adapter é para fora também.

Outras dicas

Parece que vai exigir um loop sobre todos os componentes para ver se eles têm uma dica de ferramenta. Estou à procura de um valor global. Pode ser que um loop é factível, mas parece ineficiente.

Isso é muito ruim. Depois de uma discussão interna, "feio reflexão" foi o que veio com tão bem, mas eu estava esperando que alguém lá fora, teve uma idéia melhor.

Uma vez que você já tem o seu próprio createToolTip (), talvez você pode tentar algo como isto:)

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;
}
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top