Pregunta

Tengo una lista, cada elemento tiene varias cosas, incluido un JProgressBar que se puede actualizar mucho.Cada vez que uno de los elementos actualiza su JProgressBar, el ListDataListener en la lista intenta desplazarla al rango visible usando

/*
 * 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);
    }
}

Tenga en cuenta que estoy tratando de asegurarme de que el desplazamiento se realice en el hilo de envío, ya que pensé que tal vez el problema era que se desplazaba mientras se repintaba.Y aún así, todavía tengo el problema de que si las cosas están realmente activas, algunos de los elementos de la lista se pintan fuera de la ventana gráfica, sobrescribiendo lo que está fuera de la ventana gráfica. JScrollPane.Forzar un evento de exposición volverá a pintar esas cosas, pero es molesto.

¿Hay algo más a lo que deba prestar atención para evitar que estas cosas se pinten fuera de su área de recorte?

¿Fue útil?

Solución

¿Ha intentado habilitar explícitamente el doble almacenamiento en búfer en JList y/o los componentes sobre los que está dibujando?(con:setDoubleBuffered(boolean aFlag))

Otro pensamiento es que tu podría Es necesario salir de la función inmediatamente después de delegar en el EDT.Por la forma en que está escrito su código, parece que la actualización se realizará en ambos hilos si ContentChanged se invoca desde un hilo que no es EDT.Iniciando sesión primero if (o establecer un punto de interrupción en el si - pero no en el ejecutable, debería ayudar a determinar si ese es su problema.

p.ej:

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);
     }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top