2009-07-27 2 views
23

Sto provando a impostare i suggerimenti su un JEditorPane. Il metodo che utilizzo per determinare quale testo del tooltip mostrare è piuttosto intenso per la CPU - e quindi mi piacerebbe mostrarlo solo dopo che il mouse si è fermato per un breve periodo di tempo - diciamo 1 secondo.Imposta il tempo di ritardo del suggerimento per un particolare componente nell'oscillazione Java

So che posso usare ToolTipManager.sharedInstance().setInitialDelay(), tuttavia questo imposterà il tempo di ritardo per le descrizioni dei comandi su tutti i componenti swing contemporaneamente e non lo voglio.

+0

Cosa fai presente nel tooltip che non può essere calcolato in un thread in background? – akarnokd

+0

Alcuni esempi di codice potrebbero essere utili. Potrei forse dare un esempio di ciò di cui sto parlando. – jjnguy

+0

Voglio cambiare il contenuto del suggerimento a seconda di quale parola l'utente sta passando sopra. Il compito di compilare il contenuto del tooltip è piuttosto costoso, quindi voglio eseguire quel calcolo solo se l'utente è in stallo su una parola. – Scottm

risposta

6

Bene, vorrei raccomandare di eseguire l'attività intensiva della CPU su un altro thread in modo che non interrompa le normali attività della GUI.

Questa sarebbe una soluzione migliore. (Invece di cercare di aggirare il problema)

* Edit * si potrebbe calcolare le tootips per ogni parola nella JEditorPane e memorizzarli in un Map. Quindi tutto quello che dovresti fare è accedere allo scarto dal Map se cambia.

Idealmente le persone non spostano il mouse e digitano contemporaneamente. Pertanto, puoi calcolare i tootlip quando il testo cambia e trascinarli dallo Map allo mouseMoved().

+0

La tua modifica è un ottimo suggerimento. Non sono sicuro che funzionerà perché in realtà è un debugger su cui sto lavorando e quindi i valori inseriti nella mappa sono soggetti a modifiche - è comunque una grande idea. Penso che anche il tuo suggerimento di calcolare il valore in un thread sia buono. – Scottm

+0

Sì, sono d'accordo - una forma di memorizzazione nella cache della risposta mentre il mouse si sposta e recuperarla quando l'utente si ferma potrebbe risolvere il mio problema. Darò una prova domani - imposterò la tua risposta ad accettata. Grazie per l'aiuto. – Scottm

3

Puoi mostrare tu stesso il popup. Ascoltare per mouseMoved() eventi, avviare/arrestare il timer e poi mostrare pop-up con il seguente codice:

Prima di tutto bisogna PopupFactory, Popup, e ToolTip:

private PopupFactory popupFactory = PopupFactory.getSharedInstance(); 
private Popup popup; 
private JToolTip toolTip = jEditorPane.createToolTip(); 

poi, per mostrare o nascondere il tooltip :

private void showToolTip(MouseEvent e) { 
    toolTip.setTipText(...); 
    int x = e.getXOnScreen(); 
    int y = e.getYOnScreen(); 
    popup = popupFactory.getPopup(jEditorPane, toolTip, x, y); 
    popup.show(); 
} 

private void hideToolTip() { 
    if (popup != null) 
     popup.hide(); 
} 

Questo vi darà ritardo regolabile e un sacco di guai :)

+0

Nel mio caso, se si passa sopra un'icona all'inizio della barra di stato, viene visualizzata una descrizione comandi con i messaggi "n" precedenti. Finché si mantiene il mouse entro i limiti del tooltip rimane.Ma volevo controllare tutti gli aspetti della tempistica senza cambiare i tempi dei tooltip globali. Secondo me, la tua soluzione sembra un'alternativa molto migliore rispetto alla risposta accettata, ma sono solo i miei due centesimi? Grazie per questa soluzione Piligrim, ci proverò molto presto! – Jeach

+0

Non ho guardato questo thread da molto tempo ma mi piace il tuo suggerimento. Non ho mai avuto la possibilità di finire questo progetto, quindi ci riproverò presto. Darò alla tua idea uno scatto :) – Scottm

23

Se quello che vuoi è quello di rendere il tooltip respingere ritardo molto più lungo per una specifica componente, allora questo è un bel trucco:

(complimenti a tecnologia a http://tech.chitgoks.com/2010/05/31/disable-tooltip-delay-in-java-swing/)

private final int defaultDismissTimeout = ToolTipManager.sharedInstance().getDismissDelay(); 

addMouseListener(new MouseAdapter() { 

    public void mouseEntered(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(60000); 
    } 

    public void mouseExited(MouseEvent me) { 
    ToolTipManager.sharedInstance().setDismissDelay(defaultDismissTimeout); 
    } 
}); 
+0

+1, ma ho fatto una modifica. Ho preso il timeout predefinito al di fuori di 'mouseEntered()', perché ha il potenziale di rovinare tutto se si imposta defaultDismissTimeout più volte (cosa succede se l'utente ha più componenti affiancati in cui hanno cambiato il timeout? Potrebbero perdere completamente il timeout di default spostandosi da uno all'altro.) Idealmente, sembra che defaultDismissTimeout diventi globale per assicurarsi che sia impostato una sola volta, durante l'inizializzazione dell'intera applicazione. – ArtOfWarfare

+0

@ArtOfWarfare, nel blog collegato, defaultDismissTimeout è stato contrassegnato come finale, che suppongo sia il modo in cui sono riusciti a ottenere le impostazioni multiple. –

+0

@BuhBuh - Ho modificato la risposta qui per prendere defaultDismissTimeout all'esterno del listener, ma nel codice effettivo che ho scritto in base a questa risposta, ho deciso di renderlo una variabile finale statica per il mio componente. Se desideri visualizzare i valori effettivi predefiniti, consulta le linee 85-91 qui: http://grepcode.com/file/repository.grepcode.com/java/root/jdk/openjdk/6- b14/javax/oscillazione/ToolTipManager.java – ArtOfWarfare