Domanda

Esiste un modo elegante in Swing per scoprire se ci sono dei suggerimenti attualmente visualizzati nella mia cornice?

Sto usando tooltip personalizzati, quindi sarebbe molto facile impostare un flag nel mio metodo createToolTip () , ma non riesco a vedere un modo per scoprire quando il tooltip è sparito .

ToolTipManager ha una bella bandiera per questo, tipShowing, ma ovviamente è private e non sembrano offrire un modo per arrivarci. hideWindow () non chiama il componente tooltip (che posso dire), quindi non vedo un modo lì.

Qualcuno ha qualche buona idea?

Aggiornamento: sono andato con la riflessione. Puoi vedere il codice qui:

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;
    }
}
È stato utile?

Soluzione

Sembra che la proprietà isEnabled () di hideTipAction sia direttamente collegata al booleano tipShowing. Puoi provare questo:

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

Probabilmente vuoi fare un po 'di controllo della sanità mentale per null, ecc. Ma questo dovrebbe farti avvicinare abbastanza.

MODIFICA, alle tue risposte:

A parte qualche brutto codice di riflessione, non credo che tu abbia molta scelta. Non è possibile sottoclassare ToolTipManager a causa del costruttore privato del pacchetto e showTipWindow () e hideTipWindow () sono anche pacchetti privati, quindi il modello Adapter è anche fuori.

Altri suggerimenti

Sembra che richiederà un ciclo su tutti i componenti per vedere se hanno una descrizione comandi. Sto cercando un valore globale. È possibile che un ciclo sia fattibile, ma sembra inefficiente.

È un peccato. Dopo una discussione interna, "brutta riflessione" era quello che ci è venuto in mente, ma speravo che qualcuno là fuori avesse avuto un'idea migliore.

Dato che hai già il tuo createToolTip (), forse puoi provare qualcosa del genere :)

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;
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top