# externe ActionListener Klasse



## Guest (8. Apr 2004)

Hallo,
mein Problem.
Ich habe ein JFrame mit einem Button und möchte die externe Klasse MyListeners aufrufen.
Bekomme aber den Fehler stackOverFlowError.

Woran liegts?


```
public class ListenerTest extends JFrame{
	
	MyListeners ml;
	
	JLabel aLabel = new JLabel("Hallo");
	JPanel aPanel = new JPanel(new BorderLayout());
	JButton aButton = new JButton("Test");

	// Konstruktor
	public ListenerTest() {
		super();
		
		aButton.addActionListener(ml = new MyListeners());
		
		aPanel.add(aButton, BorderLayout.NORTH);
		aPanel.add(aLabel, BorderLayout.CENTER);
		getContentPane().add(aPanel);
		pack();
	}
	
	public static void main(String[] args) {
		ListenerTest aListenerTest = new ListenerTest();
		aListenerTest.setLocation(100, 100);
		aListenerTest.setSize(400, 300);
		aListenerTest.setVisible(true);

	}

}
```

Hie die KLasse MyListeners

```
public class MyListeners extends ListenerTest implements ActionListener {

	public MyListeners() {
		super();

	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == aButton) {
			aLabel.setText("Wie gehts?");
		}

	}

}
```


----------



## Mick (8. Apr 2004)

Warum erbt MyListeners von ListenerTest? Indem Du eine Instanz von ListnerTest erzeugst,
erzeugst Du mehrere.

Besser gelöst wäre es, wenn Du bei Instanzierung von MyListners dem Konstrukter eine Instanz von
Listenertest mitgibst, dann kannst Du auch auf alle Komponenten zugreifen.

Grüße,
Mick


----------



## bummerland (8. Apr 2004)

erstell dir doch einfach deinen eigenenen listener:

```
public class MyListener implements ActionListener { //und noch mehr, wenn gebraucht
    public void actionPerformed(ActionEvent e){
        ...
    }
}
```
den nutzt du dann als actionlistener in deiner gui,


----------



## Mick (8. Apr 2004)

Hi,

so meine ich das:


```
public class ListenerTest extends JFrame{
	
	MyListeners ml;
	
	public JLabel aLabel = new JLabel("Hallo");
	JPanel aPanel = new JPanel(new BorderLayout());
	public JButton aButton = new JButton("Test");

	// Konstruktor
	public ListenerTest() {
		super();
		ml = new MyListeners(this);
		aButton.addActionListener(ml);
		
		aPanel.add(aButton, BorderLayout.NORTH);
		aPanel.add(aLabel, BorderLayout.CENTER);
		getContentPane().add(aPanel);
		pack();
	}
	
	public static void main(String[] args) {
		ListenerTest aListenerTest = new ListenerTest();
		aListenerTest.setLocation(100, 100);
		aListenerTest.setSize(400, 300);
		aListenerTest.setVisible(true);

	}

}

public class MyListeners implements ActionListener {


                ListenerTest test;

	public MyListeners(Listenertest test) {
		this.test = test;

	}

	public void actionPerformed(ActionEvent e) {
		if (e.getSource() == test.aButton) {
			test.aLabel.setText("Wie gehts?");
		}

	}

}
```


Besser wäre es natürlich noch, auf die Komponenten von ListenerTest mittels get...-Methoden
zuzugreifen, anstatt sie public zu machen.

Hoffe, damit kommst Du weiter.
Grüße,
Mick


----------

