GUI Builder ActionListener

Alles was mit Swing und AWT zu tun hat

Moderatoren: wegus, Olek77

daflowjoe
Beiträge: 8
Registriert: 12.09.2012, 22:42

GUI Builder ActionListener

Beitrag von daflowjoe » 12.09.2012, 22:51

Hey Leute,

ich arbeite mit einem Card Layout und habe mehrere Unterframes die ich switche. Daher habe ich quasi eine Viewklasse. Wie kann ich festlegen, dass zum Beispiel die actionPerformed Methode in einer bestimmtem ActionListener Klasse generiert wird? Momentan generiert NetBeans einfach alles in die die Datei der Frame Klasse hinein. Dafuer wurde sogar eine extra Klasse FormListener in dieser Datei generiert (2 Klassen in einer Datei), was mir garnicht gefaellt. Ich haette gern entweder eine andere selbstdefinierte Klasse, wo alle Listener reingehen oder am besten fuer jede Komponente die Moeglichkeit selbst anzugeben, welche Klasse benutzt wird. Wie kann ich das am besten erreichen?

Etwas salopp gesagt:
Wenn ich also auf einen Button doppelklicke soll dann die actionPerformed Methode in meiner festgelegten Klasse generiert werden.

Ich hoffe ihr koennt mir helfen :)

Lg Simon

NetbeansUser
Beiträge: 13
Registriert: 07.09.2012, 16:46

Re: GUI Builder ActionListener

Beitrag von NetbeansUser » 13.09.2012, 06:43

Du hast die Möglichkeit, im im Propertiesfenster bei Anwahl deiner Elternkomponente den "Listener Generation Style "von anonymour inner class" auf "Main Class" zu ändern.

Du hast die Möglichkeit, im Propertiesfenster auf "Events" zu gehen, dort "actionperformed" anzuwählen und über die 3 Punkte einen eigenen Handler vorzugeben.

Du hast die Möglichkeit, im Propertiesfenster auf "Properties" zu gehen, dort "action" auszuwählen und dort über "Customcode" deine eigene Action anzugeben

Du hast die Möglichkeit, den Button mit der rechten Maustaste anzuklicken und unter "Customize Code" beliebigen eigenen Code unterzubringen.

Möglichkeit 1 und 4 sollten deine Anforderungen erfüllen

daflowjoe
Beiträge: 8
Registriert: 12.09.2012, 22:42

Re: GUI Builder ActionListener

Beitrag von daflowjoe » 13.09.2012, 10:37

Hallo,

danke fuer die Antwort. Es hilft mir leider aber nur bedingt weiter.

zu 1. - Wenn ich auf Main Class umstelle, aendert sich am Verhalten leider nichts. Wenn ich einen Button erstelle, erstellt er die actionPerformed Methode wieder im parent Jframe. Das soll er eben nicht. Ich moechte, dass er diese z.B. in die Klasse EventHandlers packt. Oder kann ich irgendwo die Main Class angeben?

zu 2, Wenn ich einen eigenen Handler vorgebe erstellt mir nur eine actionPerformed Methode mit anderen Namen, aber wieder in die JFrame Datei!

zu. 3 Damit ist es mir moeglich eine eigene Action Klasse mit set Action fuer jeden Button zu uebergeben. Allerdings habe ich dann garkeine Code Genration mehr sondern muss dann sowas fuer jeden Button in meine angebene Klasse ei
fuegen:

Code: Alles auswählen

if (evt.getSource() == jButton6) {
                jButton6ActionPerformed(evt);
            }
            else if (evt.getSource() == AssignButton1) {
                navigation(evt);
            }
           ...
            }
zu 4. Gleiches Prinzip wie 3, Ich kann dort zwar die ActionListener Klasse beinflussen.

Immerhin kann ich jetzt alles manuell umbiegen.

Aber gibt es nicht doch eine Moeglichkeit die automatische Code Generierung zu nutzen?

Vielen Dank

NetbeansUser
Beiträge: 13
Registriert: 07.09.2012, 16:46

Re: GUI Builder ActionListener

Beitrag von NetbeansUser » 13.09.2012, 11:45

Aber gibt es nicht doch eine Moeglichkeit die automatische Code Generierung zu nutzen?
Nein...deine Anforderungen sind auch etwas ungewöhnlich

daflowjoe
Beiträge: 8
Registriert: 12.09.2012, 22:42

Re: GUI Builder ActionListener

Beitrag von daflowjoe » 13.09.2012, 12:18

Schade, naja ich finde die Anforderungen eigentlich nicht ungewoehnlich. Wer korrektes Softwaredesign nach MVC einhalten will, will doch keine action Methoden im View haben?! Sowas gehoert normalerweise doch in einen Controller. Naja dann schreib ich es halt manuell.

Wie wuerde man denn als erfahrener Entwickler in Java vorgehen? Ich will zum Beispiel mit Buttons zwischen einzelnen Panels mittels Cardlayout wechseln oder eine Tabelle generieren, Daten speichern etc.. Einfach die action in der Viewdatei lassen und dann direkt auf die Models zugreifen?

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: GUI Builder ActionListener

Beitrag von Olek77 » 13.09.2012, 12:29

Hi,

Ich würde den GUI-Builder dann nicht verwenden. Meine Erfahrungen mit diesem sind auch eher
"medium".

Ist eben ein sehr gutes tool um einfache bis mittelkomplizierte UI's zu bauen aber
wenn es filigran wird kann er - und das ist auch normal - nicht mehr so ganz mit halten.

Was du möchtest habe ich auch noch nicht so häufig gesehen.
Wieso machst du nicht ne innere Klasse in deinen Views auf?
Eine eigene öffentliche Klasse nur für Listener halte ich nicht für sinnvoll.
Die Listener gehören nahe an den Ort wo die Ereignisse auch ankommen.

Ich kenne das MVC-Prinzip. Von dieser Aufteilung habe ich aber noch nichts gehört.
Wo hast du das denn her? Vielleicht aus einer anderen Programmiersprache?

Viele Grüße,

Olek
- Netbeans Certified Associate -

NetbeansUser
Beiträge: 13
Registriert: 07.09.2012, 16:46

Re: GUI Builder ActionListener

Beitrag von NetbeansUser » 13.09.2012, 12:46

Wer korrektes Softwaredesign nach MVC
View -> wenn der Listener nicht dahin gehört wo dann?? Ist doch eindeutig eine Viewkomponente

Benutzeravatar
nigjo
Beiträge: 632
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: GUI Builder ActionListener

Beitrag von nigjo » 13.09.2012, 13:00

Hi Simon.

Dein Problem ist, dass du versuchst quasi deine gesamte Anwendung innerhalb des Matisse Editors zu quetschen. Das kann nur zu Problemen führen. Ich würde dir Raten deine UI-Elemente in mehrere Klassen aufzuteilen. Das ist im ersten Schritt keine Kleinigkeit, wird dir aber im weiteren Verlauf deutlich weniger Scherereien bringen.

Vorweg: Für alle Änderungen die ich dir jetzt vorschlage wird es eine Unmenge von Fehlermeldungen hageln. Bitte versuche sie zunächst zu ignorieren, die können im Anschluss des gesamten Refactorings bearbeitet werden.
  1. Deine aktuelle Klasse mit den Elementen lasse bitte zunächst so wie sie ist.
  2. Erstelle für jedes Panel, dass du in dein CardLayout packen möchtest eine eigene Klasse ("JPanel Form").
  3. Kopiere (!) für jedes Panel die entsprechenden Elemente aus der alten Klasse (copy&paste funktioniert auch mit dem Matisse Editor) in jeweils eine der neu erstellen Panelklassen.
  4. Erstelle eine neue Frameklasse mit dem Matisse ("JFrame Form"). Stelle als Layout das CardLayout ein.
  5. Kommentiere alle Fehlermeldungen aus den Panelklassen aus (nicht löschen, die brauchen wir noch) und sorge dafür, dass dein Projekt einmal compiliert (!) werden kann. Es wird nicht lauffähig sein, aber wir brauchen an dieser Stelle nur ein Fehlerfrei compilierendes Projekt.
  6. DANACH kannst du die einzelnen Panelklassen aus der Projektansicht in den MatisseEditor des neuen Frames ziehen (Drag&Drop FTW)
  7. Jetzt kannst du nach und Nach die auskommentierten Quelltexte wieder reaktivieren und die Fehler beseitigen
Die alte Klasse mit allen Panel auf einmal drin kannst du danach "deaktivieren". Das Ergebnis dieser Aktion ist ein deutlich besser wartbares Projekt wo du jedes Panel einzeln bearbeiten kannst. Für die Datenverwaltung zwischen den einzelnen Panel habe ich heute Vormittag einen entsprechenden Blogeintrag verfasst: http://blog.nigjo.de/netbeans/2012/09/k ... roperties/

Gruß
Jens

ps:
NetbeansUser hat geschrieben:Nein...deine Anforderungen sind auch etwas ungewöhnlich
Denke ich nicht.
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

Benutzeravatar
nigjo
Beiträge: 632
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: GUI Builder ActionListener

Beitrag von nigjo » 13.09.2012, 13:03

NetbeansUser hat geschrieben:
Wer korrektes Softwaredesign nach MVC
View -> wenn der Listener nicht dahin gehört wo dann?? Ist doch eindeutig eine Viewkomponente
Wenn man sich strikt an das MVC Konzept hält, gehört der ActionListener in der Tat nicht in das View. Ein ActionListener bedeutet Benutzereingabe und gehört damit in den Controller. Das View ist nur die Anzeige selbst.

Allerdings sollte man das nicht sooo eng sehen. Swing selbst verwendet ein "modifiziertes MVC" bei dem View und Controller meist in einer gemeinsamen Klasse unter gebracht sind.

Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

daflowjoe
Beiträge: 8
Registriert: 12.09.2012, 22:42

Re: GUI Builder ActionListener

Beitrag von daflowjoe » 13.09.2012, 14:54

Danke Jens. Ich hab das jetzt mal so gemacht und ich finde das dann so auch etwas uebersichtlicher. Die Code Generation funktioniert dann auch in den einzelnen Klassen. Soweit Super. Es gibt allerdings einen Haken bzw. weiss ich nicht wie ich die einzelnen Panel Klassen dazu bekomme, dass sie das MainFrame kennen. Das wird ja benoetigt um

Code: Alles auswählen

CardLayout cl = (CardLayout)(MainPanel.getLayout());
        cl.show(MainPanel, "configpanel");
Allerdings ist in der MainPanel-Klasse der Code der die Panels erzeugt blockiert. Ich kann also nicht einfach das Objekt ueber den Konstruktor uebergeben.
Wie bekomm ich da jetzt den Zugriff auf das MainPanel?

Gruss Simon

Benutzeravatar
nigjo
Beiträge: 632
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: GUI Builder ActionListener

Beitrag von nigjo » 13.09.2012, 15:15

daflowjoe hat geschrieben:Allerdings ist in der MainPanel-Klasse der Code der die Panels erzeugt blockiert. Ich kann also nicht einfach das Objekt ueber den Konstruktor uebergeben.
Wie bekomm ich da jetzt den Zugriff auf das MainPanel?
Keine Stelle des "Blockierten Codes" ist in Stein gemeißelt. Ein allgemeiner Irrglaube bei der Verwendung des Matisse GUI Builders. Man kann ihn nicht in der Java-Quelle direkt bearbeiten, das ist korrekt. Aber auch gut so. Dafür ist der "Code" Reiter in den Properties der einzelnen Elemente dein Freund. Dort kann jede generierte Zeile individuell angepasst werden. Auch der Erzeugungscode der Objekte. Es lassen sich aber auch ohne weiteres zusätzliche Methodenaufrufe ergänzen. (z.B. um ein Datenobjekt zu setzen)

Was du auch machen kannst ist die SwingUtilities benutzen. Mit SwingUtilities.getWindowAncestor() solltest du deine JFrame Instanz bekommen (und dann .getContentPane().getLayout()). An die aktiven Fenster kommt man aber auch mit JFrame.getFrames(). In dem Array muss man dann nur noch seine eigene Implementierung suchen (Und nein, es ist NICHT immer das erste Element des Arrays!)

Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

Benutzeravatar
Olek77
Beiträge: 669
Registriert: 21.03.2009, 13:09

Re: GUI Builder ActionListener

Beitrag von Olek77 » 13.09.2012, 15:19

Etwas Offtopic,

Mich würde mal interessieren wer schon größere Projekte mit dem GUI-Builder erfolgreich zu Ende gebracht hat.

Gruß,

Olek
- Netbeans Certified Associate -

Benutzeravatar
nigjo
Beiträge: 632
Registriert: 08.09.2009, 09:43
Wohnort: Aachen
Kontaktdaten:

Re: GUI Builder ActionListener

Beitrag von nigjo » 13.09.2012, 15:28

Olek77 hat geschrieben:Etwas Offtopic,
Mich würde mal interessieren wer schon größere Projekte mit dem GUI-Builder erfolgreich zu Ende gebracht hat.
Für unsere NetBeans RCP (>150 Module) verwende ich den GUI Editor für diverse Panels. Ein wunderbar hilfreiches Werkzeug, wenn man nicht versucht seine komplette Anwendung darin zu programmieren. Sowas ist albern.

Aber auch komplexe Panels lassen sich damit erstellen und seit in NetBeans 7.2 die "Gaps" editierbar geworden sind macht es noch mehr Spass damit zu arbeiten. Wenn man die von mir oben beschriebenen Schritte beachtet und seine Panel in verschiedene Klassen aufteilt, funktioniert der Matisse prima auch bei großen Projekten.

Gruß
Jens
Man sollte seine Werkzeuge kennen. Ansonsten haut man sich mit dem Hammer nur auf die Finger.

--
NetBeans Certified Engineer - Java Getriebe

daflowjoe
Beiträge: 8
Registriert: 12.09.2012, 22:42

Re: GUI Builder ActionListener

Beitrag von daflowjoe » 13.09.2012, 16:23

Also da wird ein Schuh draus. Danke :) Damit bin ich jetzt erstmal zufrieden. Ich finde das auf jeden Fall deutlich uebersichtlicher. So langsam komme ich auch hinter das Verhalten des GUI Builders. Eure Antworten haben mir wirklich sehr geholfen,
Jetzt kann ich wieder ruhig schlafen und kann alles in Ruhe runterfrickeln. Danke

Den Rest des Softwaredesigns kann ich ja nun selber steuern, daher seh ich da auch keine Probleme, wenn das Projekt groesser werden sollte, Sicherlich werde ich viele Panels und grafische Teilkomponenten brauchen, Diese werden ich dann bei Bedarf auslagern und bekomme keinen unwartbaren Monsterklassen. Um das MVC trotzdem aufrecht zu erhalten rufe ich nach einer Action die entsprechende Controller Methode auf, (Wird halt nicht direkt aufgerufen, aber was solls)

Gruss Simon

Benutzeravatar
smurfi
Site Admin
Beiträge: 1639
Registriert: 29.06.2006, 11:33
Wohnort: Wuppertal
Kontaktdaten:

Re: GUI Builder ActionListener

Beitrag von smurfi » 15.09.2012, 05:50

Hallo,
Olek77 hat geschrieben:Etwas Offtopic,

Mich würde mal interessieren wer schon größere Projekte mit dem GUI-Builder erfolgreich zu Ende gebracht hat.
ich habe eine NetBeans RCP Anwendung bei uns für die HR Abteilung umgesetzt, diese hat diverse Maske welche auch recht umfangreich sind.
Wie schon hier geschrieben, es kommt halt darauf an wie du ihn benutzt.

Gruß
Michael

Antworten