2015-05-21 9 views
6

Mi piacerebbe implementare una descrizione in Swing che abbia un comportamento personalizzato: più a lungo l'utente si posiziona sul componente, maggiori dettagli dovrebbero essere visualizzati nel tooltip (ad esempio, alcune nuove righe vengono aggiunte dopo alcuni secondi del utente che passa il mouse sopra il componente). Ho solo bisogno di verificare se è davvero fattibile con Swing senza che le cose si complichino troppo. La mia idea in questo momento sarebbe probabilmente:Estendere ToolTipManager di Swing per modificare il comportamento al passaggio del mouse?

  • Estendere ToolTipManager
  • Override mouseEntered per avviare un timer (magari utilizzare javax.swing.Timer?). Chiama setToolTipText e createToolTip per aggiornare la descrizione comando e aggiungere nuove informazioni a intervalli regolari
  • Override mouseExited per azzerare il timer
  • probabilmente usare setDismissDelay per impostare il ritardo respingere a qualcosa di molto più a lungo (o Integer.MAX_VALUE)

Una cosa del genere è fattibile o non è un buon modo di lavorare con Swing (scusate, sono abbastanza nuovo)? C'è un modo migliore per farlo?

[modifica] Hmm, appena ricordato che ToolTipManager è un singleton con un costruttore che ha solo visibilità del pacchetto, quindi non può essere esteso.

[modifica 2] Sto provando alcune soluzioni al momento. Una cosa che ho dimenticato di aggiungere è che ho bisogno di sapere quale componente è stato sospeso sopra - che presumo significhi che dovrò lavorare con una sorta di listener con un metodo mouseEntered() (o essere in grado di accedervi informazione). E non è necessaria altra interattività con il popup/tooltip - ha solo bisogno di visualizzare le informazioni.

+1

"* È possibile una cosa del genere? *" Sì. La tua strada sembra una buona opzione, ma senza un'implementazione concreta è difficile dirlo .. – user1803551

+0

Vero! Se sembra un'opzione decente, ci provo, probabilmente il modo migliore per scoprirlo. –

+0

Con altre informazioni potrei guidarti un po 'di più. Qualcosa del tipo "per ogni X secondi aggiuntivo di passaggio del mouse, aggiungi un'altra riga al testo del suggerimento" essere un buon esempio di ciò che vuoi ottenere? – user1803551

risposta

1

(Questo può sembrare un po 'confuso quindi fammi sapere se hai bisogno di me per chiarire fammi sapere e cercherò di mostrarti come immagino il codice) Penso che la tua idea potrebbe funzionare come se la estendessi, e anche fare una classe privata che si estende Thread e poi nel metodo run() fai qualcosa come

while(true) 
{ 
    sleep(1); 
    timeElapsed++; 
} 

e nella tua classe che estende ToolTipManager, creare un campo per quella classe che estende Thread e nel mouseEntered(MouseEvent e) un'istanza cosa Mi piace:

extendsThreadClass = new ExtendsThreadClass(); 
extendsThreadClass.start(); 

e poi nel metodo mouseExited(MouseEvent e) fare

extendsThreadClass = null;

allora in quel metodo mouseEntered(MouseEvent e) dopo l'inizio del Thread allora si può fare ciò che si vuole fare dopo la cosa tempo come

if(timeElapsed > 3000) 
{ 
    //what you want to do here 
} 

Spiacente può essere fonte di confusione, fammi sapere se posso chiarire per voi

0

Ho pensato che dovrei aggiornare E questo con l'approccio che ho preso prima di vedere la risposta di l1zZY (che credo sia il modo migliore di fare le cose - avevo ancora dei bug nel mio codice prima di passare a qualcos'altro, ma questo potrebbe essere ancora utile a qualcuno).Questo è quello che ho fatto:

  • Estendere JToolTip
  • utilizzare un timer swing per la temporizzazione
  • Aggiungi un ascoltatore MouseMotion alla JTree (nel mio caso ho voluto il pop-up per mostrare quando un nodo è stato aleggiava)
  • po inelegantly, rilevano quando il mouse spostato su un nodo della struttura come questa:

    public void mouseMoved(MouseEvent e) { 
    int x = (int) e.getX(); 
    int y = (int) e.getY(); 
    TreePath path = getPathForLocation(x, y); 
    if (path == null) { 
        tooltip.hide(); 
    } else { 
        TreeNode node = (TreeNode) path.getLastPathComponent(); 
        tooltip.setHoveredNode(node); 
        if (!tooltip.isVisible) { 
         int absX = e.getXOnScreen(); 
         int absY = e.getYOnScreen(); 
         final Popup tooltipContainer = PopupFactory.getSharedInstance().getPopup(PDTreeView.this, 
           tooltip, absX, absY); 
         tooltip.setToolTipContainer(tooltipContainer); 
         tooltip.show(); 
        } 
    } 
    

    }

  • tooltip.show() si riferisce a come il suggerimento era contenuto in un Popup per poterlo mostrare o nascondere a livello di programmazione. show() mostra il Popup (e quindi il suggerimento) e avvia anche il timer Swing.

  • Il timer ha un metodo chiamato actionPerformed() che viene chiamato a qualsiasi intervallo impostato. Ho appena avuto quel metodo per chiamare il codice che aggiunge nuove informazioni al suggerimento. in hide(), ho azzerato il tooltip e il timer.

Ho riscontrato problemi con il popup o il suggerimento non ridimensionato per adattarlo al contenuto, ma per il resto questo sembrava ok.

Problemi correlati