2013-06-15 13 views
5

Meine Klasse implementiert ActionListener.Muss die geerbte abstrakte Methode implementieren

JMenuItem mntmNew = new JMenuItem("New..."); 
    mntmNew.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doNew(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmNew); 

    JMenuItem mntmLoad = new JMenuItem("Load..."); 
    mntmLoad.addActionListener(new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e){ 
      doLoad(e); //calls to outer class for cleaner code 
     } 
    }); 
    mnFile.add(mntmLoad); 

//etc. for the rest of the menu system 

jedoch Eclipse sagt mir noch, dass meine Klasse der geerbte abstrakte Methode ActionListener.actionPerformed (Action e) implementieren müssen: Ich habe die folgenden verschachtelten Klassen unten umgesetzt. Können Sie auf diese Weise keine Überschreibungsmethoden in einer geschachtelten Klasse implementieren?

+0

Down-Vote abgebrochen mit einem Up-Vote. Ich bin mir nicht sicher, warum jemand diese Frage abgelehnt hat, da es für mich eine gültige Frage zu sein scheint. –

+0

++ wegen der @ HovercraftFullOfEels Antwort :) – Azad

Antwort

8

Ihre Frage:

Können Sie nicht überschreiben Methoden in einer verschachtelten Klasse auf diese Weise implementieren?

Die Antwort ist nein. Eclipse (eigentlich Java) beschwert sich, dass, während Sie Ihre Klasse sind erklärt als Action Implementierung Sie nicht Ihre Klasse die notwendige actionPerformed(...) Methode in der Klasse des eigenen Rahmen zu geben - und diese letzte Teil sehr wichtig ist. Die Klasse, die die Schnittstelle implementiert, muss alle erforderlichen Methoden der Schnittstelle in ihrem eigenen Bereich und nicht in geschachtelten Klassen implementieren. Beachten Sie, dass Sie dadurch nicht daran gehindert werden, Klassen zu verschachteln, die auch ActionListener oder andere Schnittstellen implementieren. Die Regel bleibt jedoch, dass eine nicht abstrakte Klasse, die eine Schnittstelle implementiert, der Methoden der Schnittstelle überschreiben muss.

Da Sie jedoch keine Objekte Ihrer Klasse als ActionListener verwenden, besteht die einfache Lösung darin, Ihre Klasse nicht als Implementierung der ActionListener-Schnittstelle zu deklarieren. Problem gelöst. Und eigentlich ist es viel besser, wenn Ihre GUI-Klasse Ihre Listener-Interfaces nicht implementiert, da die Kombination in einer Klasse eine Klasse dazu bringt, zu viel zu tun. In technischer Hinsicht reduziert es unnötigerweise den Zusammenhalt einer Klasse und riskiert, ihre Kopplung zu erhöhen, was ihre Lesbarkeit und Wartbarkeit verringert.

+1

Ich war zu dieser Schlussfolgerung gekommen (GUI sollte die Listener-Schnittstellen nicht implementieren) nach der Forschung, die ich getan hatte, die das Problem einführte, das ich fragte. Interessant, dass die Standard-Oracle-Dokumentation anscheinend keinerlei Bezug auf die korrekte Implementierung von actionlisters auf einem großen Menüsystem hat. – Daniel

+0

@Daniel: Ich denke, dass die Oracle-Dokumentation ein guter Ausgangspunkt ist, um die Grundlagen von Swing zu lernen, aber das ist so weit wie es geht. Ich selbst habe Probleme damit, das Erstellen und Verwalten von großen Swing-Anwendungen zu erlernen und zu versuchen, es so sauber wie möglich in Bezug auf MVC, Entkopplung und Dependency-Injection zu halten. OOP-Artikel und Online-Video-Präsentationen helfen. –