Lösung eines Listener Problems durch annonyme Klasse??
-
hi,
Versuche ein Fenster mit Menü zu bauen und würde gerne die ActionEvents nicht durch bloßes Implementieren des ActionListeners in Frame lösen.
Möchte das Problem durch eine annonyme Klasse in der Klasse MainMenu lösen.
Leider gibt es keine Hilfklasse dafür (ActionAdapter) kann mir wer bei meinem Quellcode helfen? Bekomme da immer Fehlermeldungen. Danke schon mal im Voraus.Der Quelltext:
import java.awt.*; import java.awt.event.*; class MainMenu extends MenuBar { public MainMenu(ActionListener listener) { Menu menu = new Menu("Datei"); MenuItem item = new MenuItem("Beenden"); item.setActionCommand("Beenden"); item.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent event) { String cmd = event.getActionCommand(); if(cmd.equals("Beenden")){ setVisible(true); dispose(); System.exit(0); } } }); menu.add(item); this.add(menu); } } public class MainFrame2 extends Frame { public MainFrame2() { super("Ereignissbehandlung"); setLocation(100,100); setSize(300,200); setMenuBar(new MainMenu()); setVisible(true); } public static void main(String argv[]) { MainFrame2 wnd = new MainFrame2(); } }
-
Es gibt keinen ActionAdapter da das ActionListener-Interface lediglich aus der Methode actionPerformed besteht. Die anonyme Klasse hast du ja bereits implementiert. Eine andere Möglichkeit wäre eine eigene Eventklasse zu schreiben die aber im Prinzip auch nichts anderes macht als deine anonyme Klasse.
-
Ja die habe ich schon gebaut, aber ich bekam und bekomme immer noch Fehler angezeigt. Einen habe ich schon ausgeräumt. Dem Konstruktor der Klasse MainMenu
darf kein Argument vom Typ ActionListener übergeben werden. (Hatte das aus versehen übrigbehalten von der ganz einfachen Variante mit der Erweiterung von Frame extends Action Listener).Aber er sagt mit jetzt dass er setVisible(false) und dispose() nicht aufrufen kann. Woran liegt das. Ich weiß, weil es jetzt außerhalb der Klasse MainFrame liegt. Aber wie löse ich dass. Bin leider noch Anfänger und krieg das beim besten Willen nicht hin.
-
Ja da kriegst du Probleme mit dem Scope. Ein Event lässt sich nämlich nicht sichtbar oder unsichtbar machen
Jedenfalls kannst du dies umgehen, indem du in deiner actionPerformed-Methode eine Methode der übergeordneten (Frame) Klasse aufrufst. Beispiel:
jMenu1.addActionListener(new java.awt.event.ActionListener() { public void actionPerformed(java.awt.event.ActionEvent evt) { jMenu1ActionPerformed(evt); } }); ... public void jMenu1ActionPerformed(ActionEvent evt) { // Do some action here }
Die Namen sind so gewählt weil ich mir keine ausdenken wollte
-
Das funktioniert kein Stück so.
Hab das genau so abgetippt.