AWT Applet - Button aus anderer Klasse abfragen

Maddin222

Mitglied
Hallo JAVA-Gemeinde,

ich habe ein Problem mit der Abfrage der Buttons im AWT Applet. Wenn ich alles in eine Klasse (zB. TestMain.class) schreibe, funktionieren die Buttons einwandfrei. Um den Code etwas übersichtlicher zu gestalten, möchte ich den Code in Klassen aufteilen. Doch nun kann kann das Event nicht mehr mit dem Button verglichen werden (siehe Kommentar bei System.out). Ist die Vorgehensweise eigentlich richtig? Oder hat jemand eine Idee dazu? Bin über jeden Tipp dankbar ;-)

Hier ein Beispiel:

TestMain.class
Java:
package Testbeispiel;

import java.applet.Applet;
import java.awt.CardLayout;
import java.awt.Container;
import java.awt.Event;
import java.awt.Panel;


public class TestMain extends Applet {

	Container CntHauptmenu;
	CardLayout cl;
	static Panel cardPanel;

	public void init() {
		
		CntHauptmenu = this;
		CntHauptmenu.setLayout(null);
		
		cardPanel = new Panel();
		cardPanel.setBounds(10, 20, 300, 300);

		cl = new CardLayout();
		cardPanel.setLayout(cl);
		CntHauptmenu.add(cardPanel);

		ViewHauptmenu.InitMenu();

		System.out.println(ViewHauptmenu.BtnEins); // AUSGABE: null
	}

	public boolean action(Event event, Object eventobject) {
			
		System.out.println(event.target);	// AUSGABE: java.awt.Button[button0,50,75,120x30,label=1]
		 
		System.out.println(ViewHauptmenu.BtnEins); // AUSGABE: null
		 
		if (event.target == ViewHauptmenu.BtnEins) {							
			System.out.println("Button 1 gedrückt");
		}
		
		if (event.target == ViewHauptmenu.BtnZwei) {							
			System.out.println("Button 2 gedrückt");
		}
		
		return false;
	}
}


ViewHauptmenu.class
Java:
package Testbeispiel;

import java.awt.Button;
import java.awt.Label;
import java.awt.Panel;


public class ViewHauptmenu {

	Label LblUberschrift;
	static Button BtnEins;
	static Button BtnZwei;
	Panel PnlHauptmenu;
	
	public static void InitMenu() {
		
		Panel PnlHauptmenu = new Panel();
		PnlHauptmenu.setLayout(null);
		PnlHauptmenu.setBounds(10, 15, 300, 300);
		TestMain.cardPanel.add(PnlHauptmenu, "Hauptmenu");
		
		Label LblUberschrift = new Label("Bitte wählen...");
		LblUberschrift.setBounds(10, 25, 220, 20);
		PnlHauptmenu.add(LblUberschrift);
		
		Button BtnEins = new Button("1");
		BtnEins.setBounds(50, 75, 120, 30);
		BtnEins.setFocusable(false);
		PnlHauptmenu.add(BtnEins);
		
		Button BtnZwei = new Button("2");
		BtnZwei.setBounds(50, 115, 120, 30);
		BtnZwei.setFocusable(false);
		PnlHauptmenu.add(BtnZwei);

		System.out.println(BtnEins); // AUSGABE: java.awt.Button[button0,50,75,120x30,label=1]
	}

}
 
Zuletzt bearbeitet:
OK, hat sich erledigt 😳

Habe die action(event)-Abfrage gelöscht und in der View-Klasse unter Zeile 28 den ActionListener mit einer anonymen Klasse hinzugefügt.

Java:
		BtnEins.addActionListener(new ActionListener() {
			// Anonyme Klasse
			@Override
			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				System.out.println("Button gedrückt");
			}
		});
 
Sieht so aus, als wenn du das veraltete Event-Model aus Java 1.0 benutzt.
Seit Java 1.1 gibt es das Delegation-Model.

In dem Fall gibts dann für Buttons das [JAPI]ActionListener[/JAPI]-Interface, von welchem du die einzige enthaltene Methode überschreibst. An deinen Button hängst du dann nur noch eine Referenz auf ein Listener-Objekt.
Am besten, du schaust dir mal die Beispiele von "Java ist auch eine Insel" an.

[EDIT]Deine Lösung ist absolut richtig.[/EDIT]
 
Vielen Dank für die Info L-ectron-X 😉

Vielleicht kann mir nochmal jemand helfen? Bin am verzweifeln :shock:

Für den ActionListener habe ich eine neue Klasse "MeinActionListener" angelegt. Hier treten leider zwei Probleme auf:

Wenn ich in der ViewHauptmenu.class beim Button
Java:
BtnEins.addActionListener(new MeinActionListener(this));
einfüge, wird "this" immer rot markiert, da es in statischen Methoden nicht aufgerufen werden kann. Und ohne Static kann ich ViewHauptmenu.InitMenu() nicht ausführen.

Meine zweite Frage wäre, ob dann die MeinActionListener so richtig ausgewertet werden würde:
Java:
package Testbeispiel;

import java.awt.event.ActionEvent;


public class MeinActionListener {

	private TestMain Applet;
	
	private MeinActionListener (TestMain Applet) {
		this.Applet = Applet;
	}
	
	public void actionPerformed(ActionEvent arg0) {
		System.out.println("Button gedrückt");
	}
}

Ich habe versucht mich weitgehend an diesem Video zu orientieren: Java_Tutorial_P11_ActionListener2_2.mp4 - YouTube (ab 4:03)
Im Video funktioniert das mit Frames. Vielleicht kann mir jemand einen Tipp geben, wie das in meinem Applet klappen könnte.
 

Zurück
Oben