Frage

Ich habe eine Liste, in der jedes Element mehrere Dinge enthält, darunter a JProgressBar die viel aktualisiert werden kann.Jedes Mal, wenn eines der Elemente aktualisiert wird JProgressBar, Die ListDataListener in der Liste versucht, mit in den sichtbaren Bereich zu scrollen

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

Beachten Sie, dass ich versuche sicherzustellen, dass das Scrollen im Dispatch-Thread erfolgt, da ich dachte, dass das Problem möglicherweise darin liegt, dass beim Neuzeichnen gescrollt wird.Und doch habe ich immer noch ein Problem, bei dem einige der Listenelemente außerhalb des Ansichtsfensters angezeigt werden, wenn die Dinge wirklich aktiv sind, und überschreiben, was außerhalb des Ansichtsfensters liegt JScrollPane.Durch das Erzwingen eines Belichtungsereignisses werden diese Dinge neu gezeichnet, aber es ist ärgerlich.

Gibt es sonst noch etwas, worauf ich achten muss, um zu verhindern, dass diese Dinge außerhalb ihres Beschneidungsbereichs malen?

War es hilfreich?

Lösung

Haben Sie versucht, die Doppelpufferung für die JList und/oder die Komponenten, über die sie zeichnet, explizit zu aktivieren?(mit:setDoubleBuffered(boolean aFlag))

Ein anderer Gedanke ist, dass du könnte Sie müssen die Funktion sofort nach der Delegierung an den EDT verlassen.So wie Ihr Code geschrieben ist, sieht es so aus, als würde das Update in beiden Threads stattfinden, wenn ContentChanged wird von einem Nicht-EDT-Thread aufgerufen.Melden Sie sich zuerst an if (Oder setzen Sie einen Haltepunkt im if -- but nicht in der ausführbaren Datei – sollte dabei helfen, festzustellen, ob das Ihr Problem ist.

z.B:

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);
     }
}
Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top