Da ich im Betrieb meistens nach dem MVC-Prinzip meine Programme aufbaue, ist die GUI immer ausgelagert. Das erhöht natürlich zum einen die Übersichtlichkeit aber auch den Arbeitsaufwand ein wenig.
Aber an sich musst du das für dich entscheiden:
Wenn es wirklich nur ne kleine Anwendung für dich zu Hause ist, kannst du's ja ruhig in der Startklasse lassen aber sobald mehrere Leute daran arbeiten oder du es später noc hausbauen willst, bietet sich eine auslagerung natürlich an
ich würde es aus Prinzip schon immer auslagern und nicht unbedingt zu sparsam sein was neue Klassen angeht, generell erstelle ich für jeden abgeschlossenen Komplex in der GUI eine neue Klasse, seis Logfenster, Editoren, Listenansichten etc.
So weiss ich genau wo ich zu suchen habe, wenn ich Komponente X ändern möchte.
publicclassMyFrame{privateJFrame theFrame;publicvoidbuildGui(){
theFrame =newJFrame("...");// alles mit theFrame wie in deinem code
theFrame.setVisible(true);}}
publicclassMyFrame{privateJFrame theFrame;publicvoidbuildGui(){
theFrame =newJFrame("...");// alles mit theFrame wie in deinem code
theFrame.setVisible(true);}}
classMyFrame{privateJFrame theFrame;publicvoidbuildGui(){
theFrame =newJFrame("...");// alles mit theFrame wie in deinem codeSwingUtilities.invokeLater(newRunnable(){@Overridepublicvoidrun(){
theFrame.setVisible(true);}});}}
aber ich baue meine GUI auch in einer eigenen Klasse mit eigener Methode zum starten. In die main kommt bei mir nur das Notwendigste.
publicclassMyFrame{privateJFrame theFrame;publicvoidbuildGui(){
theFrame =newJFrame("...");// alles mit theFrame wie in deinem code
theFrame.setVisible(true);}}
Hab das von einem Artikel, den ich auf Java World gelesen habe. Wenn ich mich richtig erinnere wird dort erklärt wiso man EventQueue nutzen muss, damit die Swing Applikation threadsicher ist.
Korrigiert mich wenn ich was falsch im Kopf habe... habe den Artikel vor einem Jahr oder so gelesen. Ich glaube auf Seite 5 ganz unten in der "Conclusion" sieht man die Struktur. Aber es lohnt sich einmal den ganzen Artikel zu lesen.
.. so wie ich es verstanden habe geht es in dem Artikel darum, die GUI von Anfang an in dem EDT zu erzeugen. Die obige Methode seh ich in der SwingUtilities-Klasse .. heisst sie schleift den Aufruf also direkt an die EventQueue weiter.
Ich weiss nicht genau, aber eventuell war das früher noch anders gewesen?! Aber mit der JDK1.6 - Lib die ich grad da hab, ist SwingUtilities.invokeLater identisch zu EventQueue.invokeLater .. aber dennoch ein interessanter Artikel der die Anfänge aufzeigt
Hab mir gerade die API angeschaut und es sieht ganz danach aus, als würde SwingUtilities auch funktionieren. Ich habe zumindest nichts finden können, was das Gegenteil beweisen würde.
du kannst mit dem einfachen Beispiel starten, aber du solltest sobald wie möglich versuchen zu verstehen, was es mit dem sog. Event Dispatcher Thread auf sich hat und warum dir das kompliziertere Beispiel mit dem SwingUtilities.invokeLater vorgelegt hat, google mal nach Tutorials darüber. Wenn du es nicht machst, wird es dir über kurz oder lang passieren, dass deine Software Fehler wegen race conditions wirf.
Einstieg: Race Condition ? Wikipedia und die unten aufgeführten Verweise. Das wirst du brauchen, um Tutorials zum GUI Start zu verstehen.
Ich würde es vermeiden, eine Operation auf den EDT zu legen, wenn ich mich innerhalb von modularem Code befinde, d.h. in Klassen, die ich später für verschiedene Programme verwenden will.
Meiner Meinung nach sollte sowas immer erst vom jeweiligen Programm an geeigneten Stellen gemacht werden. Ansonsten hat man nie genau den "Überblick" über die EventQueue, wenn sie intern in irgendwelchen Klassen die man benutzt verwendet wird.
Dann fängt man an Code auf den EDT zu legen, der Code auf den EDT legt
Das alleine ist wohl - wenn auch unnötig - nicht so schlimm. Ein absolutes No-Go ist allerdings imho ein invokeAndWait in modularem Code. Angenommen wir haben ein invokeAndWait in der buildGui() :
jm2c- keine Ahnung ob ich mit der Ansicht falsch liege? Klar es ist schön wenn eine Klasse möglichst viel kapselt, aber ich finde mit dem EDT sollte sie nicht rumpfuschen.. ueh:
Nun habe ich die GUI Sachen in eine eigene Klasse gepackt.
Doch wie weise ich z.B. einem TextField per "setText()" Strings zu, die auf Objekten basieren? Also im Beispiel z.B. jTextField1.setText(bmw.getName());
Die Objelkte werden ja erst später instanziert und daher ginge es so nicht direkt in der GUI Klasse, oder?