Event Handling Vom ActionEvent zum Parent-Namen

Moin Moin,

ich versuche gerade von einem ActionEvent über getSource() -> getParent() -> getName()
einen Switch zu bauen. Und zwar hab ich ein JTabbedPane, auf jedem Panel im TabbedPane sind Buttons drauf, ich will im ersten Moment gucken auf welchem Panel der Button sitzt und dann das ganze weiterleiten, an eine andere Operation/Klasse.

folgendes probiert und natürlich falsch *lach*
Code:
  public void actionPerformed(ActionEvent ae) {
     switch (ae.getSource().getParent().getName())
     {
       case "Programme":
         prog.starteProgramm(ae.getActionCommand());
         break;
       case "Dokumente":
         doc.oeffneDatei(ae.getActionCommand())
         break;
       case "Platzhalter":
         break;
     }
}
Zur Erklärung JButton = getSource(), JPanel = getParent(), "Programme/Dokumente" = getName()
prog und doc sind Objekte die auf eigenen geschrieben Klassen basieren.
 
Mh ich versteh die Frage nicht genau bzw. weiß nicht wie du das meinst.
Ich habe einen ActionListener, der die ActionEvents von allen Buttons bekommt und diese quasi "sortieren" soll. Ich gehe normalerweise über "getActionCommand()" und sortiere danach, aber jetzt will ich das ganze ein wenig weiter "sortieren" und das an weiter ausführende Klassen übergeben.
 
mit getSource() bekommst du doch die Adresse Deines Buttons. Was willst du da noch sortieren? Einfach

Code:
if(e.getSource() == myButton)
   doFunctionWhateverThisButtonShouldDo();
 
Ja das ich da den Button bekomme ist mir klar, ich will aber wissen auf welchem Panel der Button drauf ist.
Ich habe 3 Panels in einem TabbedPane, jedes Panel hat 3 Buttons, ich möchte über das ActionEvent wissen ob der Button auf Panel 1, 2 oder 3 bzw. wie der name des jeweiligen Panels ist.
 
Moin,

jetzt dumm gefragt:
(a) du hast genau drei Panel??
(b) du hast jeweils genau drei Button??
(c) ergo: neun unterschliedliche Button insgesamt??
(d) kann ein Button auch zweimal vorkommen??
(e) da du oben von "getActionCommand()" sprichst: hat jeder der Button ein eigenes ActionCommand gesetzt??

Gruß Klaus
 
Moin,

jetzt dumm gefragt:
(a) du hast genau drei Panel??
(b) du hast jeweils genau drei Button??
(c) ergo: neun unterschliedliche Button insgesamt??
(d) kann ein Button auch zweimal vorkommen??
(e) da du oben von "getActionCommand()" sprichst: hat jeder der Button ein eigenes ActionCommand gesetzt??

Gruß Klaus

a) nein es sind bisher 3 Panels, ob es noch mehr werden ist unsicher.
b) nein das ist variabel, je nachdem was später hinzugefügt wird (Wieviele Programme, Dokumente und andere Dinge vom Programm aus gestartet bzw. geöffnet werden sollen)
c) ergo... siehe b 😀 variabel, das war nur eine Beispielmenge.
d) nein keine doppelten Buttons
e) klingt vllt nach Amateur, da mir "getActionCommand()" die Beschriftung des Buttons ausgibt, nutze ich diese zum Vergleich im Switch. Ich hab bisher nie darüber nachgedacht ein eigenes ActionCommand zu setzen.

PS: Ich bin auch für Tipps offen, wie man damit in der Regel umgeht, da ich neu bis ganz neu dabei bin.
Ich mache das im Rahmen eines Projektes in meiner Ausbildung und bring mir das meiste eigentlich selbst bei.
 
Du hast die Button doch auf die Panel gesetzt. Dann wirst du doch wohl auch wissen welcher Button auf welchem Panel ist?

Ja das weiß ich, ich könnte auch direkt über das ActionCommand gehen, aber ich würde das gern anders sortieren, damit mein "Listener" nicht die arbeit macht, sondern nur "weiterleitet". Ich versuche nämlich das MVC-Paradigma umzusetzen, mein Listener ist das Control und soweit ich das verstanden habe, ist der Control nur der "ich gebe das Weiter"-Typ zwischen dem View und dem Model und letzteres macht quasi die ganze Arbeit, während das View alles "zeigt" 😉
 
Falsch. Der Controller macht die Ganze Arbeit. Das Model macht überhaupt nichts ausser Daten zu halten. Dein ActionListener ist auch kein Teil des Controllers sondern er gehört zum View und er macht genau das was er soll, nämlich dem Controller mitteilen was er tun soll wenn ein bestimmer Button gedrückt wird.

Gruß

Claus
 
Falsch. Der Controller macht die Ganze Arbeit. Das Model macht überhaupt nichts ausser Daten zu halten. Dein ActionListener ist auch kein Teil des Controllers sondern er gehört zum View und er macht genau das was er soll, nämlich dem Controller mitteilen was er tun soll wenn ein bestimmer Button gedrückt wird.

Gruß

Claus

Ok dann weiß ich shcon mal eine Sache *grins*

Mein Control ist jetzt aber quasi ein ActionListener, er ist als sich selbst an das View übergeben und wird da als Listener an die Buttons gehängt.

Müsste ich jetzt (MVC bedingt) einen ActionListener im View-Package als Extraklasse erstellen und im in meinem Frame (bzw. JDialog) einbinden?
 
Ich würde das anders lösen. Der ActionListener kommt in den View. Ob du da jetzt eine Methode machst und mit getSource() alle Buttons abfragst oder ob du bei jedem Button einen ActionListener per inLine schreibst ist dabei relativ schnuppe. Jetzt hast du zwei Möglichkeiten.

1) Du weißt, dass Inhalte und/oder Änderungen in diesem View niemals jemand anderes interessiert als Deinen Controller. Dann kannt Du den "einfachen" Weg gehen und dem View eine Referenz auf Deinen Controller mitgeben und im ActionListener jeweils die passende Function im Controller aufrufen. Ist aber eher die unschönere Methode für schreibfaule.
2) Du erstellst ein Interface und machst den Controller zum Listener des View. Im Interface definierst Du dann alle Methoden die das View auslösen kann und der Controller verarbeitet diese dann entsprechend.

Gruß

Claus
 

Zurück
Oben