# ActionListener in extra Klasse auslagern mit Extends?



## Angiii (7. April 2009)

Hallo,

Ich habe ein Applet, welches unter anderem eine JTabbedPane enthält. Die Grafikelemente der einzelnen Tabs habe ich in eigene Klassen ausgelagert. Die dazugehörigen Listeners befinden sich in meine Hauptklasse "Mainclass" wo auch die JTabbedPane wieder zusammengesetzt wird. Ist es möglich, die einzelnen Listeners ebenfalls in extra Klassen auszulagern, z.B. mit "extends"?

Hier mal was ich mir vorgestellt habe (und was natürlich nicht funktioneirte....):


In Klasse Tab4 befindet sich das GUI-Element, hier z.B. ein Radiobutton

```
public class Tab4  {
        private JRadioButton showImage = null;

        private JRadioButton getshowImage() {
		if (showImage == null) {
			showImage = new JRadioButton();	
		}
		return showImage
	}
}
```

Mainclass ist meine Hauptklasse (hier stark verkürzt). In ihr wird die JTabbedPane vereint. 

```
puplic class Mainclass extends JApplet {
      public Tab4 tab4 = new Tab4(); 
      public List4 list4 = new List4();

        public Mainclass() {
		super();
	}

	public void init() {
		this.setSize(767, 517);
		this.setContentPane(getJContentPane());
	}

        private JTabbedPane getJTabbedPane() {
		if (jTabbedPane == null) {
			jTabbedPane = new JTabbedPane();
			
                        jTabbedPane.addTab("Picture", tab4.getJPanelTab4());
		
                        list4().handleTab4(); // diese Funktion sollte die Listeners hinzufügen		
		
		}
		return jTabbedPane;
	}

      private void sendCommand(String xy) {
           // hier steht eine Funktion
       }
}
```



Klasse List4 enthält die Listeners für Tab4 und erbt von der Mainclass:

```
public class List4 extends Mainclass {
      public void handleTab4(){
	      	tab4.getshowImage().addActionListener(new ActionListener() {
 			public void actionPerformed(ActionEvent e) {
 				sendCommand("Hallo");
 				
 			}
		});
     }	
}
```

Ich hoffe mein Problem ist nachvollziehbar. Kann ich die Listeners in eine extra Klasse auslagern oder ist das so wie ich da mir vorstelle gar nicht möglich?
Vielen Dank schonmal für Eure Hilfe!


----------



## MiMi (7. April 2009)

Wenn List4 nen Listener werden soll, muss dieser auch von Actionlistener erben und net von der main 
Von diesem erstellst du ein neues Object und dem Tab fuegst du den listener zu den du erstellt hast mit .addActionListener


----------



## Angiii (7. April 2009)

Das Problem ist, dass ich von Main erben muss, da dort Funktionen habe, die über die ActionListeners ausgeführt werden sollen (z.B. sendCommand). Daher hatte ich vor, die ActionLIsteners lokal zu erzeugen, damit ich kein "list4 extends ActionListener" brauche.


----------



## MiMi (7. April 2009)

Dann musst du es aber net von Main erben lassen sondern einfach das object mitgeben
ala

```
List4 listenerList4 = new List4(this);
tab4.getshowImage().addActionlistener(listenerList4);
```


----------



## Matze (7. April 2009)

Hallo,

```
import java.awt.event.*;

class MyActionListener implements ActionListener{
		
    private Mainclass objMainKlasse;

    /** Konstruktor */
    public MyActionListener(Mainclass _objMainKlasse){
        this.objMainKlasse = _objMainKlasse;
    }

    public void actionPerformed(ActionEvent ae){
        this.objMainKlasse.funktionAusDerMainKlasse();
    }
}
```
Indem du beim erstellen einer Instanz von der externen Actionlistener-Klasse ein Objekt deiner Hauptklasse übergibst, kannst du auch über diese Objekt auf die Funktionen deiner Hauptklasse zugreifen


----------



## takidoso (7. April 2009)

Ich denke mal, es geht technisch sowol das eine von der Main-Klasse erben, so Sie selbst ein ActionListener ist, als auch der Vorschlag von Matze, dem Listener ein Objekt der "Hauptklasse" zu geben, um dann auf seine Methoden aufrufen zu können (Agregation). 
Man kann aber auch einen ActionListener implementieren und ihn in der Hautklasse als eingebette Klasse (z.B. private deklariert) verwenden. Dieser hätte dann Automatisch Zugriff auch auf die privaten Methoden der "Hauplklasse".

Es ist eigetnlich "nur" eine Frage des Klassen/Objekt Designs; funktionieren dürten davon alles. Ich selbst hielte es nicht für so sonderlich prinkelnd weil da Methoden in der "Hauptklasse" aufzurufen sind zu vererben. Ich würde viellecht mir Gedanken machen, ob die Methoden die ich da in der "Hauptklasse" habe wirklich dort hin gehören und wenn möglich diese Mehtode in einer entsprechenden ActionListener-Klasse reinbringen. Falls doch die Routinen unbedingt zur "Hauptklasse" gezählt werden sollen, würde ich den ActionListener als innnere Klasse (anonym, privat oder ähnliches) vermutlich bevorzugen, wenn meine Hauptklasse selbst nicht der ActionListener sein soll.
Für Matzes Vorschlag (Agregation) spräche wenn man den ActionListener unbedingt außerhalb der "Hauptklasse" verwenden möchte.


----------



## Matze (7. April 2009)

Ich bevorzuge in dem Fall eigentlich auch lieber innere Klassen, nur dachte ich, es wäre für die ersten Experimente erstmal einfacher, da man so das auftrennen in mehrere Klassen leichter lernt


----------



## MiMi (8. April 2009)

Solange sich der/ die Threadersteller/in dazu net aeussert, werden wir wohl nie erfahren fuer was er/sie scih entschieden hat und ob es ihm/ihr geholfen hat


----------



## Angiii (8. April 2009)

Hallo,

ich bin schon noch da, kam bloß gestern nicht mehr zum Testen Eurer Vorschläge ;-).
Schonmal vielen Dank für Eure Hilfe! Hab zwar noch nicht viel ausprobiert, aber ich glaube das Hauptproblem liegt an meiner momentanen Programmstrukur. Ich schau mal, dass ich meine Hauptklasse ein bisschen vom Kommunikationspfad entkopple, vielleicht über ein Interface oder so.

Ich teste das heut mal.


----------



## Angiii (9. April 2009)

Ich hab jetzt ein bißchen rumgespielt und würde gerne Eure Meinung/Kritik/Verbesserungsvorschläge zu folgendem Ansaz hören:

Ich hab ein Interface mit folgendem Inhalt erstellt (gekürzt):


```
public interface TabInterface {
   public Tab4 tab4 = new Tab4(); 
}
```
Dieses Interface binde ich mit "implements" in die Hauptklasse "Mainclass" und die ActionListenerklasse "List4" ein. Meine Kommunikatiosnroutinen habe ich nochmal in eine extra Klasse ausgelagert.

Funktionieren tut es jedenfalls. Aber ist das auch zweckmäßig oder kann ich damit noch Probleme bekommen?


----------

