Java Substance L&F EventDispatchThread

PEASANT KING

Commander
Registriert
Okt. 2008
Beiträge
2.412
Moin moin liebe Programmierer,

ich habe ein wirklich nervendes Problem, ich habe eine Klasse View die einfach aus einem JFrame abgeleitet ist auf der einige Components liegen.

Eine Main Class und eine ViewController Class.

In der Controller Class wird der JFrame instanziert, desweiteren beinhaltet die Klasse noch eine Methode showView()

PHP:
public void showView() {
    java.awt.EventQueue.invokeLater(new Runnable() {
      @Override
      public void run() {
         view.setVisible(true);
      }
    });
}
Nun habe ich mich mal für ein nicht System Look & Feel entschieden und bin bei Substance hängen geblieben, soweit so gut.

Alles eingebunden wird auch angezeigt, allerdings bekomme ich immer die lästige Fehlermeldung: Component creation must be done on Event Dispatch Thread

Wenn ich das Look & Feel in der showView Methode aber setze wird es nicht angezeigt und das Nimbus wird verwendet, die Meldung ist aber weg.

Benutze ich das SystemL&F gibt es auch absolut keine Probleme.

Wie werde ich die Meldung los ?

Wichtig ist mir das ich eine Main Class habe wo ich ViewController aufrufe und das JFrame Class in der ViewController aufgerufen wird, da ich die Methoden zur Steuerung der Buttons usw in der View in ViewController auslagern will.
 
DJ_We$t schrieb:
Benutze ich das SystemL&F gibt es auch absolut keine Probleme.

Wie werde ich die Meldung los?

Indem Du Deine GUI-Komponenten im EDT erstellst! Das sollte man immer machen, um mögliche Probleme zu vermeiden. Grundregel: alle Zugriffe auf die GUI immer im EDT (es gibt nur zwei, drei Ausnahmen, die threadsafe sind).

Du solltest also auch schon das Erstellen des JFrame mit #invokeLater umschließen.

http://docs.oracle.com/javase/tutorial/uiswing/concurrency/dispatch.html
 
Dazu muss ich ja auch die Klasse View im EDT instanzieren oder ?

Wie komme ich dann an die Components dran, z.B. einen Button ?
Ich kann ja dann nicht auf die Getter, Setter zugreifen von einer externen Klasse.

Oder habe ich einen Denkfehler.

Ich kann auch gerne mal meine .java Dateien hier anfügen.
 
DJ_We$t schrieb:
Dazu muss ich ja auch die Klasse View im EDT instanzieren oder ?

Ich kenne Deinen Code nicht. Normalerweise hat man irgendwo eine Methode, die die GUI erstellt und startet und das geschieht im EDT.

PHP:
public static synchronized <T extends Application> void launch(final Class<T> applicationClass, final String[] args) {
        Runnable doCreateAndShowGUI = new Runnable() {
            @Override
            public void run() {
                try {
                    application = create(applicationClass);
                    application.initialize(args);
                    application.startup();
                    application.waitForReady();
                } catch (Exception e) {
                    String msg = String.format("Application %s failed to launch", applicationClass);
                    logger.log(Level.SEVERE, msg, e);
                    throw (new Error(msg, e));
                }
            }
        };
        SwingUtilities.invokeLater(doCreateAndShowGUI);
    }


DJ_We$t schrieb:
Wie komme ich dann an die Components dran, z.B. einen Button ? Ich kann ja dann nicht auf die Getter, Setter zugreifen von einer externen Klasse.

Wozu benötigst Du das?

DJ_We$t schrieb:
Ich kann auch gerne mal meine .java Dateien hier anfügen.

Das solltest Du tun.
 
Hat sich erledigt, habe es hin bekommen.
Dennoch vielen Dank für die Hilfe.
 
Zurück
Oben