2017-05-22 3 views
1

Ich bin ein Student und wir haben gerade angefangen, Grafiken zu erstellen. Ich habe zwei Zuweisungen mit actionListener gemacht. In beiden Zuweisungen haben meine Konstrukteure diesen Code:Verwenden von actionListener

JButton.setActionListener(this) ; 

Also hier meine Frage ist, was passieren würde, wenn ich eine andere Klasse verwendet, anstelle des „dieses“ Stichwort?

ex

JButton.setActionListener(someClass) ; 
+2

Das würde von vielen Dingen abhängen. Zuerst müssten beide Klassen "ActionListener" implementieren. Wenn Sie eine andere Klasse verwenden, würden Sie den Verweis auf die Klasse verlieren, in der die Schaltfläche definiert ist (obwohl Sie über die Methode "ActionEvent # getSource" immer noch einen Verweis darauf erhalten können, bedeutet dies, dass Sie auf keine Klasse zugreifen können der Instanzfelder/Methoden der definierenden Klasse) – MadProgrammer

+0

Es wäre auch sehr empfehlenswert, einen Blick auf [Verwendung von Schaltflächen, Kontrollkästchen und Optionsfeldern] (http://docs.oracle.com/javase/tutorial/uiswing) zu werfen /components/button.html) und [Wie schreibe ich eine Aktion Listener] (http://docs.oracle.com/javase/tutorial/uiswing/events/actionlistener.html) – MadProgrammer

+2

Grundsätzlich machen Sie es richtig. 'this' wird häufig in kurzen Beispielen verwendet, da Sie einer vorhandenen Klasse eine Methode hinzufügen können und der Code weniger Platz benötigt. Normalerweise möchten Sie Klassen nicht so wiederverwenden, Sie möchten Probleme trennen, also sollten Sie eine andere Klasse als Ihren Aktionslistener haben. – markspace

Antwort

0

Sie können eine Instanz von Action hinzufügen (auch anonyme Klassen sind erlaubt). So können Sie so etwas wie:

new JButton().addActionListener(new ActionListener() { 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      //YOUR CODE 
     } 
    }); 

Oder Sie können eine andere Klasse implementieren (nennen wir es Foo) und fügen Sie ihn mit

new JButton().addActionListener(new Foo()); 

Und Sie wie funktionale Programmierung in Fall können Sie auch ein Lambda-Ausdruck;)

+0

Und offensichtlich muss Foo.class ActionListener implementieren –

0

Es bedeutet, dass diese Klasse someClass Muss implementsActionListener zusammen mit ihren implementierten Methoden wie actionperformed() Verfahren.

Like:

public class SomeClass implements ActionListener { 


     public SomeClass() { 

       //Could do things here 
     } 

     public void actionPerformed(ActionEvent e) { 
       //DDo things when button is clicked. 
       System.out.println("The button has been clicked"); 
     } 

} 
+0

'Button' ist eine AWT-basierte Klasse, am besten, um es zu vermeiden – MadProgrammer

+0

Genau @MadProgrammer, sorry darüber. –