Domanda

Ho un elenco, ogni elemento di cui ha diverse cose, tra cui un JProgressBar che può essere aggiornato un sacco.Ogni volta che uno degli elementi aggiorna la sua JProgressBar, il ListDataListener nell'elenco cerca di scorrimento per la gamma visibile utilizzando

/*
 * This makes the updating content item automatically scroll
 * into view if it is off the viewport.
 */
public void contentsChanged(final ListDataEvent evt) {
    if (!EventQueue.isDispatchThread()) {
        /**
          * Make sure the scrolling happens in the graphics "dispatch" thread.
          */
        EventQueue.invokeLater(new Runnable() {
            public void run()  {
               contentsChanged(evt);
            }
        });
    }
    if (playbackInProgress) {
        int index = evt.getIndex0();
        currentContentList.ensureIndexIsVisible(index);
    }
}

Nota che sto cercando di assicurarsi che la funzione di scorrimento è fatto nel thread di invio, in quanto ho pensato che forse il problema era da scorrere, mentre era riverniciatura.E ancora, ho ancora un problema in cui, se le cose sono realmente attivi, alcuni degli elementi di una lista di vernice al di fuori della finestra, sovrascrivendo ciò che è al di fuori del JScrollPane.Forzando un'esposizione evento ridipingere quelle cose, ma è fastidioso.

C'è qualcos'altro che ho bisogno di guardare fuori per per fermare queste cose pittura al di fuori della loro area di ritaglio?

È stato utile?

Soluzione

Hai provato a esplicitare il doppio buffering sul JList e/o i componenti che è il disegno sopra?(con:setDoubleBuffered(boolean aFlag))

Un altro pensiero è che si potrebbe bisogno per uscire dalla funzione immediatamente dopo la delega per l'EDT.Il modo in cui il codice è scritto, sembra che l'aggiornamento avverrà in entrambi i thread, se ContentChanged viene richiamato da un non-EDT thread.Il primo accesso if (o impostare un punto di interruzione nel se-ma non in eseguibile -- dovrebbe aiutare a determinare se questo è il vostro problema.

ad esempio:

public void contentsChanged(final ListDataEvent evt)
{
    if (!EventQueue.isDispatchThread())
    {
        log.debug("Delegating contentsChanged(...) to EDT");

        EventQueue.invokeLater(new Runnable() 
        {
            public void run() 
            {
                contentsChanged(evt);
            }
        });
        // don't run ensureIndexIsVisible twice:
        return;
     }

     if (playbackInProgress)
     {
         int index = evt.getIndex0();
         currentContentList.ensureIndexIsVisible(index);
     }
}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top