# Frame mit Button erstellen - Warum ist es nötig, Frame über Unterklasse zu erstellen? (Reg Listener)



## Jack159 (5. Jun 2012)

Hallo,

Beim erstellen eines JFrames geht man ja wie folgt vor:


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class App {
	
	
	public static void main(String[] args) {
		
		JFrame f = new JFrame();
		f.setVisible(true);
		f.setSize(200, 200);
	
		
	}

}
```

Dies funktioniert.


Wenn ich aber nun einen Button auf meinem Frame setzen möchte, muss ich ja mit Listenern arbeiten, wenn mein Button denn etwas machen soll, wenn man ihn anklickt.
Das Problem bzw. meine Frage: Wieso funktioniert es plötzlich nicht mehr, mit einem direkten Objekt der Klasse JFrame beim regestrieren des Listeners? 

Hier ein Beispiel wie es nicht funktioniert (Mit Button): Die Regest. des Listeners beim Button nimmt er nicht an...


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class App implements ActionListener {
	
	public void actionPerformed(ActionEvent e) {
		System.exit(0);

		
	}
	
	public static void main(String[] args) {
		
		JFrame f = new JFrame();
		JButton b = new JButton("Schließen");
		f.setVisible(true);
		f.setSize(200, 200);
		f.add(b);
		
		b.addActionListener(f);
		
		
		
	}

	

}
```


Die Regest. beim Button des Listeners nimmt er nur an, wenn ich eine Unterklasse von JFrame erzeuge und von der Unterklasse dann mein Frame erzeuge. Aber wieso? Also wieso gehts nicht mit dem oberen Beispiel? 

Hier noch das Beispiel wie es funktioniert:


```
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class App extends JFrame implements ActionListener {
	
	public void actionPerformed(ActionEvent e) {
		System.exit(0);

		
	}
	
	public static void main(String[] args) {
		
		App f = new App();
		JButton b = new JButton("Schließen");
		f.setVisible(true);
		f.setSize(200, 200);
		f.add(b);
		
		b.addActionListener(f);
		
		
		
	}

	

}
```


----------



## Fab1 (5. Jun 2012)

Bei dem oberen Beispiel sollte es funktionieren, wenn du statt "f" "this" hinzufügst.

Du musst ja immer eine Klasse hinzufügen, die ActionListener implementiert. Das heißt die Methode addActionListener erwartet eine Klasse, die das Interface ActionListener implementiert.

JFrame implementiert diese nicht daher funktioniert es damit nicht. 

Deine Klasse App erbt von JFrame *UND *implementiert ActionListener somit kannst du ein Objekt davon der addActionListener Methode übergeben.


----------



## Jack159 (5. Jun 2012)

Ahh ok, jetzt habe ich es verstanden. Vielen dank


----------

