button.addActionListener(this); - Welches this ist gemeint?

Jack159

Bekanntes Mitglied
Hallo,

Ich fange gerade mit der GUI-Programmierung an. Im Buch steht das unten aufgeführte Beispiel.
Es geht um ein Beispiel, wo ein Button erzeugt wird und wenn man ihn klickt, soll deine Bezeichnung geändert werden. Es geht also um actionListener und actionEvents.
Was ich dort aber nicht verstehe ist, was genau bei
Java:
button.addActionListener(this);
denn übergeben wird mit this. Zuerst dachte ich das Objekt "gui" wird übergeben, dem ist aber nicht so.


Java:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;


public class Test implements ActionListener {
	
	JButton button;
	
	public static void main(String[] args) {
		
		Test gui = new Test();
		gui.los();
		
		
	}
	
	public void los() {
        JFrame frame = new JFrame();
		
	    JButton button = new JButton("Klick mich");
	    
	    button.addActionListener(this);
		
		frame.add(button);
		
		frame.setSize(300, 300);
		frame.setVisible(true);
	
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	}
	
	public void actionPerformed(ActionEvent event) {
		button.setText("Ich wurde geklickt");
	}

}
 
wenn dort ein this steht wird immer die Instanz der am nächsten sichtbaren Klasse genommen..
Hier also von Test.
Diese Klasse implementiert ja auch den ActionListener, welches vorraussetzung an den Parameter ist
 
wenn dort ein this steht wird immer die Instanz der am nächsten sichtbaren Klasse genommen..
Hier also von Test.
Diese Klasse implementiert ja auch den ActionListener, welches vorraussetzung an den Parameter ist

Die einzigen Instanzen die erzeugt wurden sind doch: gui, button und frame. Und egal welche der 3 Objekte ich statt "this" dort in die Klammern reinschreibe, er zeigt es mir als Fehler an...
 
this ist eine Referenz auf das aktuelle Objekt.
Code:
addActionListener
erwartet als Übergabe einen ActionListener.
Deine Klasse Test implementiert ActionListener und kann daher an die Methode übergeben werden.
 
Mit this sollte dann die gui gemeint sein (die du in der main ja mit Test
Java:
gui = new Test();
anlegst), da diese Variable jedoch nicht im
Code:
los()
bekannt ist, führt der Aufruf
Code:
addActionListener(gui)
auch zum Fehler
 
Genaugenommen ist mit
Code:
this
nicht
Code:
gui
gemeint, sondern
Code:
gui
und
Code:
this
zeigen auf das selbe Objekt.
 
Bei
Code:
button.setText("Ich wurde geklickt");
wird übrigens eine
Code:
NullPointerException
fliegen, weil
Code:
button == null
. Das liegt daran, dass du bei
Code:
JButton button = new JButton("Klick mich");
nicht der Instanzvariable zuweist, sondern eine neue lokale Variable erstellst. Das siehst du auch daran, dass es keine Fehlermeldung geben wird, wenn du eine der beiden Variablen nicht mehr "button" nennst. Beheben lässt sich das, wenn du den Typ weglässt, also
Code:
button = new JButton("Klick mich");
schreibst.
 

Zurück
Oben