Java ActionListener aus anderer Klasse erstellen

W

WhiteLie83

Hallo ich hab da ein Problem.
Ich möchte einen ActionListener von zwei Stellen her erstellen. Aktuell ist der ActionListener einfach eine innere Klasse der ersten Klasse (X1).
Da ich nun aber auch in X2 den selben ActionListener nutzen möchte, weiß ich nicht ob das so noch geht:

public class X1 extends JFrame {
...
JMenuItem a = new JMenuItem(INFO);
a.addActionListener(new Y1());
...

public class Y1 implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
}
}

}

public class X2 extends JPanel {
...
JButton b = new JButton();
b.addActionListener(new Y1());
...
}


Nun kann ich aber aus Klasse X2 kein Objekt der Klasse Y1 erstellen.
Wie kann ich da drauf zugreifen, bzw. wie muss ich meine Implementierung Ändern, damit ich sowohl bei dem Button-Klick als auch bei dem Klick auf das Menü-Element, diesen ActionListerner benutzen kann?
 
Du musst die innere Klasse static machen, sonst ist sie von der äußeren abhängig.
Aber wie FrankBooth sagt, schlechte Idee.
 
Die eigene Klasse, ich weiß nicht warum man eine innere Klasse nicht static machen sollte.
Aber sie sollten sehr selten, max. wenn du viele Instancen/prim. Variablen auf einmal übergeben willst oder einmalig eine spezielles Exception brauchst verwendet werden.

Die äußere Klasse könnte ja genauso gut das Interface implementieren, und das JMenuItem erhält den Button (oder umgekehrt, wobei ich es so logischer finde) als Parameter in addActionListener(ActionListener).
Oder beide bekommen einen eigenen Listener in der Klasse, und eins der beiden bekommt die Instanz des anderen. Wird der Listener des Zweiten ausgeführt, wird actionPerformed(arg0) der anderen Instanz aufgerufen, die dann das macht was du willst.

Ich denke, letzteres ist die beste Methode.
 
Hallo zusammen,

wenn dieselbe Implementierung des Listeners in mehreren Klassen verwendet werden soll, würde ich eine eigene Listener-Klasse anlegen, die von den beiden X-Klassen instantiiert werden kann. Ich wüsste gar nicht, was hier eine statische innere Kalsse für einen Sinn machen würde.

Grüße
Vincent
 
Tut mir leid, ich habe bei der Frage nicht ganz mitgedacht, ich dachte mit "die eigene Klasse" meinte er die interne. Natürlich finde ich es nicht schlecht, eine eigene Klasse zu verwenden, ich wollte nur Alternativen nennen, meine letzte fände ich halt am "logischten". Aber wie du schon sagtest, "das kann man auch anderst sehen", meiner Erfahrung nach ist es am Anfang eins der wichtigsten Dinge darauf zu achten, dass man sich mit dem Klassendesign nicht selbst verwirrt, bis man seinen eigenen Projektaufbau/Stil gefunden hat.
 
Zurück