2 Stimmen

JList setListData Threading Probleme

Ich lade den Inhalt einer Datei nach JList Komponente. Wenn ich das Laden im Hauptthread durchführe, scheint alles in Ordnung zu sein - der Inhalt wird geladen. Aber wenn ich den Ladecode in einen separaten Thread verschiebe, ein Element in einer Liste auswähle und versuche, die Liste neu zu laden, erhalte ich zufällige NullPointer o IndexOutOfBounds Ausnahmen. Ich bin sicher, dass dies eine Art von Swing-Threading-Problem ist, kann aber nicht feststellen, was.

Dies ist mein Thread-Code:

@Override
public void run() {
    List<String> textLines = null;
    textLines = splitter.split(model.getLedMaxChars(), textLoader.loadText(file));
    listener.onTextLoaded(textLines);//listener is in main Swing code
}

Der Controller ist für das Zuhören zuständig:

@Override
public void onTextLoaded(List<String> textLines) {
    view.fileLoaded(model.getCurrentFile());
    view.setTextLines(textLines);
    view.enableListComponent();
}

Und die Ansicht wird aktualisiert:

public void setTextLines(List<String> textLines) {
    jList.setListData(textLines.toArray());
}

Ich habe versucht, den Faden hängen zu lassen, indem ich while(true); Schleife - dann funktioniert alles gut. Wenn ich auf neu laden drücke, ohne ein Element in einer Liste auszuwählen, funktioniert auch alles.

Kann mir jemand erklären, was ich hier übersehe?

4voto

Robert Punkte 35940

Swing-Komponenten sind in der Regel nicht thread-sicher. Das bedeutet, dass nur der Swing-Worker-Thread Änderungen vornehmen sollte:

Runnable worker = new Runnable() {  
  public void run() {
     jList.setListData(textLines.toArray());
  } 
};
SwingUtilities.invokeLater(worker);

Siehe auch:

2voto

Denis Punkte 21

Swing ist nicht thread-sicher, so dass bei der Manipulation von GUI-Elementen in anderen Threads viele seltsame Dinge auftreten können. In Ihrem Fall wäre die einfachste Lösung (aber wahrscheinlich nicht die beste) die Verwendung von SwingUtilities.invokeLater

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X