Christian Renner (ch12r)

Exception im EDT unter Substance 5.x

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

Application.java

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 😉

This entry was posted in Development and tagged , . Bookmark the permalink. Post a comment or leave a trackback: Trackback URL.

Post a Comment

Your email is never published nor shared.

You may use these HTML tags and attributes <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong> <pre class="">