Folgende Exception war das Resultat, als ich jüngst in meinem Java-Projekt das veraltete JAR-File des Substance Look & Feels der Version 4.3 mit der aktuellen Version 5.1 überschrieben habe:
org.jvnet.substance.api.UiThreadingViolationException: Component creation must be done on Event Dispatch Thread
Zugegeben: Es war schon etwas waghalsig zu glauben, dass dies auch einfach so mal gehen kann. Aber Hallo? Man darf ja wohl noch träumen.
Die Lösung auf das Problem findet man in folgendem Beitrag und ist gleichermaßen simpel und erschreckend: Substance 5.0 and Event Dispatch Thread.
Die Quintessenz ist folgende: In meiner konkreten Anwendung ist die Initialisierung der GUI in der start-Methode eines Singleton-Application-Objektes eingepackt. Im Konstruktor findet die Einbindung des Substance-Look-and-Feels statt. Im Prinzip also beinahe dieselben Voraussetzungen, wie im oben verlinkten Beispiel des französischen Kollegen. Um die Exception zu vermeiden, muss der Aufruf des GUI-Konstruktors – wie übrigens auch in jedem Swing-Tutorial der Welt beschrieben – in einer Instanz eines neuen Event Dispatch Threads erfolgen.
Und so sieht das dann aus:
public static void main(String[] args) {
java.awt.EventQueue.invokeLater(new Runnable() {
public void run() {
Application application = Application.getInstance();
application.start();
}
});
}
Die Klasse
sieht in gekürzter Version dann, wie folgt aus:
// implementiert das Singleton-Pattern
public class Application {
// Die einzige Instanz der Klasse Application
private static Application application = null;
private Application() {
JFrame.setDefaultLookAndFeelDecorated(true);
try {
UIManager.setLookAndFeel(new SubstanceBusinessBlackSteelLookAndFeel());
} catch (UnsupportedLookAndFeelException e) {
System.err.println(e.toString());
}
}
public void start() {
// Die Klasse UserInterface erbt von JFrame und erzeugt die GUI
this.ui = new UserInterface();
}
public static synchronized Application getInstance() {
if(this.application == null) {
this.application = new Application();
}
return this.application;
}
}
Fazit: Wer auf dieses Problem stößt (so wie auch der, der es beschreibt) hat wohl die erste Stunde der Swing-Lektionen übersprungen. Der Fehler resultiert einzig und allein aus persönlicher Schlamperei und Faulheit. Was man nun – mal wieder – daraus lernt? RTFM