# ActionListener auslagern



## TJava (28. Jan 2011)

Hallo ich versuche das Label in der View zu ändern und habe dafür die Action Methode ausgelagert in eine eigene Java Datei. Leider erkennt er dort den btnAnfuegen gar nicht. Wie macht man sowas?
Habe beide Klassen angehängt.



```
package view;

import java.awt.*;
import java.awt.event.*;

class LoginListener implements ActionListener {

	public void actionPerformed(ActionEvent e) {
		Object quelle = e.getSource();
		if (quelle.equals(btnAnfuegen)) {

			txtFeld1.setText("Hallo");

		}

	}

}
```



```
package view;



import java.awt.*;
import java.awt.event.*;

public class Login extends Frame {
	LoginListener LogListener;

	TextField txtFeld1;

	Button btnAnzeigen;

	public static void main(String[] args) {
		Login f = new Login();
		f.setVisible(true);
	}

	public Login() {
		super("Fenster mit Textfeldern");

		setBounds(100, 100, 480, 205);
		setLayout(null);

		LogListener = new LoginListener();

		txtFeld1 = new TextField(" Start");
		txtFeld1.setBounds(12, 23, 100, 100);
		add(txtFeld1);

		btnAnzeigen = new Button("Login");
		btnAnzeigen.setBounds(360, 80, 100, 23);
		btnAnzeigen.addActionListener(LogListener);
		add(btnAnzeigen);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				System.exit(0);
			}
		});

	}
```


----------



## Tomate_Salat (28. Jan 2011)

*EDIT* die Java-Tags hat ja SlaterB jz im Originalpost eingefügt

Hab das mal in Java-Tags kopiert. Zunächst: Referenzen/Variablen fangen mit kleinem buchstaben an: logListener.

Zu deinem Problem: natürlich kennt der listener [c]btnAnfuegen[/c] nicht. Woher auch? Also entweder du übergibst eine Referenz (z.B. beim Aufrufen des Konstruktors) oder du schreibst für jeden Button einen eigenen Listener.

MFG

Tomate_Salat


----------



## TJava (28. Jan 2011)

mmh geht leider noch nicht


```
public LoginListener(Button btnAnzeigen, TextField txtFeld1) {
		// TODO Auto-generated constructor stub

	}

	public void actionPerformed(ActionEvent e) {
		Object quelle = e.getSource();
		if (quelle.equals(btnAnzeigen)) {
			txtFeld1.setText("Hallo");

		}
```


```
logListener = new LoginListener(btnAnzeigen,txtFeld1);

		txtFeld1 = new TextField(" Start");
		txtFeld1.setBounds(12, 23, 100, 100);
		add(txtFeld1);

		btnAnzeigen = new Button("Login");
		btnAnzeigen.setBounds(360, 80, 100, 23);
		btnAnzeigen.addActionL
```


----------



## Fleur de Soleil (28. Jan 2011)

Dein Konstruktor mach auch nichts mit dem Button und dem TextField das du ihm mitgibst. Speicher die mal in Klassenvariabeln und versuche es dann nochmal


----------



## Tomate_Salat (28. Jan 2011)

wieso hast du die java-Tags durch code-tags ersetzt? oO

Du solltest dir erstmal Gedanken über die Sichtbarkeit/Gültigkeiten von deinen Variablen/Parametern machen: Galileo Computing :: Java ist auch eine Insel – 2.4 Blöcke, Initialisierung und Sichtbarkeit am besten du schaust auch noch ein wenig unter Google.

Mit einem GUI anzufangen, wenn du noch schwierigkeiten mit den Grundlagen hast, halte ich für keine gute Idee. 


```
private Button btnAnzeigen;
private TextField txtField1;

        public LoginListener(Button btnAnzeigen, TextField txtFeld1) {
                 this.btnAnzeigen = btnAnzeigen;
                 this.txtField1 = txtField1;
	}

	public void actionPerformed(ActionEvent e) {
		Object quelle = e.getSource();
		if (quelle.equals(btnAnzeigen)) {
			txtFeld1.setText("Hallo");

		}
```

so sollte es funktionieren (ungetestet). Aber wie gesagt: bleibe erstmal bei Konsolenanwendungen und lerne Grundlagen.


----------



## TJava (28. Jan 2011)

Danke schön habe es alles schon mal gemacht nur wieder vergessen ???:L


----------



## Fleur de Soleil (28. Jan 2011)

Schau dir das Beispiel von Tomate_Salat an....der macht genau das was ich dir vorgeschlagen habe


----------



## TJava (28. Jan 2011)

Ja hatte es so ähnlich auch schon gepostet aber ihr wart zu schnell 

MFG


----------



## TJava (28. Jan 2011)

OK jetzt geht es der Actionevent wird in einer eigenen Klasse ausgeführt, nur wie gebe ich jetzt wieder an die GUI die Beschriftung zurück? Muss ich da eine extra Methode schreiben oder gibt es auch einen anderen weg.

Login txtFeld1.setText("Hallo");


----------



## Tomate_Salat (28. Jan 2011)

[java=11]
if (quelle.equals(btnAnzeigen)) {
[/code]
anstatt equals würde ich hier [c]==[/c] nehmen:
[java=11]
if (quelle == btnAnzeigen) {
[/code]

Und Reihenfolgen beachten:

```
logListener = new LoginListener(btnAnzeigen,txtFeld1);
txtFeld1 = new TextField(" Start");
```

[c]textFeld1[/c] ist bis zu diesem Zeitpunkt [c]null[/c] und enthält keine Referenz auf ein Objekt. Weise erst die Referenz zu, dann sollte es funktionieren:


```
txtFeld1 = new TextField(" Start");
logListener = new LoginListener(btnAnzeigen,txtFeld1);
```

MFG

Tomate_Salat


----------



## TJava (28. Jan 2011)

Ich möchte aber die Beschreibung durch die actionPerformed Methode ändern.

```
txtFeld1.setText("Hallo");
```
 so ca.  
Das txtFeld1 ist aber nicht in der selben Klasse.

Ich habe das erst zugewiesen 


```
public Login() {
		super("Fenster mit Textfeldern");

		setBounds(100, 100, 480, 205);
		setLayout(null);

		

		txtFeld1 = new TextField(" Start");
		txtFeld1.setBounds(12, 23, 100, 100);
		txtFeld1.setText("Start2");
		add(txtFeld1);

		btnAnzeigen = new Button("Login");
		btnAnzeigen.setBounds(360, 80, 100, 23);
		btnAnzeigen.addActionListener(logListener);
		add(btnAnzeigen);
		logListener = new LoginListener(btnAnzeigen, txtFeld1);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				System.exit(0);
			}
		});
```


Das ist die Klasselogin und die actionPerformed Methode ist im LoginListener


----------



## Tomate_Salat (28. Jan 2011)

Verwende bitte die 
	
	
	
	





```
-tags und nicht die [code]-tags

Was du jz geschrieben hast, war mir schon klar, aber wo ist das Problem? Das sollte so funktionieren. Wenn es nicht tut wie es soll, poste bitte nochmal beide klassen komplett.
```


----------



## TJava (28. Jan 2011)

So hier nochmal die beiden Klassen als erstes LoginListener 


```
package view;

import java.awt.*;
import java.awt.event.*;

class LoginListener implements ActionListener {

	private Button btnAnzeigen;
	private TextField txtField1;
	 
	        public LoginListener(Button btnAnzeigen, TextField txtFeld1) {
	                 this.btnAnzeigen = btnAnzeigen;
	                 this.txtField1 = txtFeld1;
	    }
	 
	    public void actionPerformed(ActionEvent e) {
	        Object quelle = e.getSource();
	        if (quelle== btnAnzeigen) {
	         txtFeld1.setText("Hallo");
	 
	        }

	}

}
```
Und das hier ist die Klasse Login


```
package view;

import java.awt.*;
import java.awt.event.*;

public class Login extends Frame {
	LoginListener logListener;

	static TextField txtFeld1;

	Button btnAnzeigen;

	public static void main(String[] args) {
		Login f = new Login();
		f.setVisible(true);
	}

	public Login() {
		super("Fenster mit Textfeldern");

		setBounds(100, 100, 480, 205);
		setLayout(null);

		

		txtFeld1 = new TextField(" Start");
		txtFeld1.setBounds(12, 23, 100, 100);
		txtFeld1.setText("Start2");
		add(txtFeld1);

		btnAnzeigen = new Button("Login");
		btnAnzeigen.setBounds(360, 80, 100, 23);
		btnAnzeigen.addActionListener(logListener);
		add(btnAnzeigen);
		logListener = new LoginListener(btnAnzeigen, txtFeld1);
		
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent we) {
				System.exit(0);
			}
		});

	}

}
```

EDIT: Ich habe jetzt noch  txtFeld1.setText("Hallo"); geändert zu txtField1.setText("Hallo");
Jetzt kann ich es ohne Fehlermeldung ausführen aber es verändert sich nichts:-(

Vielen Dank für eure Hilfe


----------



## TJava (29. Jan 2011)

Kann mir jemand helfen bitte ich komme nicht drauf :-(


----------



## TJava (29. Jan 2011)

Habe es geschafft, nur habe ich noch ein paar kleine Fragen.


In dieser Art funktioniert es. Also ich weise Referenz logListener im ActionListener ein Objekt der Klasse LoginListener zu und übergebe dieser Instanz mit dem Namen logListener zwei Objekte (btnAnzeigen, txtFeld1)


```
btnAnzeigen = new Button("Login");
		btnAnzeigen.setBounds(360, 80, 100, 23);
		btnAnzeigen.addActionListener(logListener = new LoginListener(btnAnzeigen, txtFeld1));
```

Hey ich verstehe es nun :-D:toll::toll:

Noch eine Frage hätte ich. Wieso verändert sich das txt überhaupt?
Wie stehen die in Beziehung zueinander? Wie kann man das verstehen?
Im Login ist die Referenz auf das TextFeld txtFeld1
Im LoginListener ist die Referenz txtFeld1ImListener
Ist es so das wenn ich eins ändere das andere immer mitgeändert wird?
Wo finde ich mehr Infos dazu?


```
public void actionPerformed(ActionEvent e) {
            Object quelle = e.getSource();
            if (quelle== btnAnzeigenImListener) {
            	System.out.println("Hallo");
                txtFeld1ImListener.setText("Hallo");
     
            }
```


----------

