ActionListener auslagern

TJava

Bekanntes Mitglied
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.


Java:
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");

		}

	}

}


Java:
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);
			}
		});

	}
 
Zuletzt bearbeitet von einem Moderator:
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
 
mmh geht leider noch nicht

Code:
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");

		}

Code:
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
 
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.

Java:
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.
 
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");
 
Zuletzt bearbeitet:
[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:
Java:
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:

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

MFG

Tomate_Salat
 
Ich möchte aber die Beschreibung durch die actionPerformed Methode ändern.
Code:
 txtFeld1.setText("Hallo");
so ca.
Das txtFeld1 ist aber nicht in der selben Klasse.

Ich habe das erst zugewiesen

Code:
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
 
Zuletzt bearbeitet:
Verwende bitte die
Java:
-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.
 
So hier nochmal die beiden Klassen als erstes LoginListener

Java:
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

Java:
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
 
Zuletzt bearbeitet:
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)

Java:
		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?

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

Neue Themen


Zurück
Oben