Delegation Event Model: Zugriff auf andere Komponente

janpaet

Grünschnabel
Hallo,
ich habe meinen GUI- und Anwendungscode getrennt.
In meinem Formular befinden sich ein JTextField und ein JButton.

Frage:
Wie kann ich in der Command-Klasse den Inhalt des Textfeldes einlesen, wenn auf den Button geklickt wurde?

Wäre prima, wenn mir jemand mit einem Link oder einer Lösung weiterhelfen könnte.

Vielen Dank
Gruß Jan

Hier kurz mal der Quellcode der:
- GUI
Code:
public class MyFrame extends JFrame{

	private static final long serialVersionUID = 1L;
	private MyCommand cmd;
	private JButton jb;
	private JTextField jt;
	
	public MyFrame(MyCommand cmd){
		super("MyFrame");
		this.cmd = cmd;
		showMyFrame();
	}
	
	private void showMyFrame(){
		Container cp = getContentPane();
		cp.setLayout(null);
		
		jt = new JTextField();
		jt.setBounds(100, 50, 100, 25);
		cp.add(jt);
		
		jb = new JButton("MyButton");
		jb.setBounds(100, 80, 100, 25);
		jb.addActionListener(cmd);
		cp.add(jb);
		
		setLocation(100, 100);
		setSize(300, 200);
		setVisible(true);
	}
}

- Command-Klasse
Code:
public class MyCommand implements ActionListener {

	@Override
	public void actionPerformed(ActionEvent event) {
		if (event.getActionCommand().equals("MyButton"))
			System.out.println("Inhalt meines Textfeldes");
	}
}

- und der Main-Klasse
Code:
public class MyMain {
	
	public static void main(String[] args){
		MyFrame frm = new MyFrame(new MyCommand());
	}
}
 
Im ActionEvent Objekt ist deine Komponente enthalten. Allerdings halte ich es nicht für Sinnvoll den ActionListener aus der GUI rauszuziehen. Denn der Listener gehört noch zur Oberfläche. Das was du mit dem Text aus deinem Textfeld tust gehört in eine Controller Klasse.
 
Vielen Dank zeja,
kannst Du mir auch sagen, wie ich im ActionEvent-Objekt auf das Textfeld zugreifen kann?

Zum anderen würde gern Deinen Vorschlag mit den Controller-Klassen verwenden. Leider weiß ich nicht, wie ich Controller-Klasse anzulegen haben.

Hast Du dafür einen Link?

Viele Grüße
Jan
 
wenn du auf MVC Architektur achtest passt das schon so, dass du Model, View und Controller trennst....

also so wie du es jetzt gemacht hast, den Listener als eigne Klasse und nicht als innere Klasse oder anonyme Klasse in der View Klasse

in Java ist es aber auch durchaus üblich, View und Controller nicht zu trennen wie zeja schon sagt....


wenn du beim ActionEvent auf irgendwas aus der anderen Klasse zugreifen willst bietet es sich an, das im Konstruktor der Controller Klassen zu übergeben
also, dass du dann z.B später aufrufen würdest
jb.addActionListener(new MyCommand(jb);
gut wäre vlt. auch ein Kontruktor der den kompletten MyFrame übergibt....dann noch setter u getter methoden dort...und dann kannst du im Controller alle änderungen machen die du willst
 
Besten Dank Jejune,
das hat doch mal richtig weitergeholfen.

Da habe ich genau in die falsche Richtung gedacht.
Ich hätte nicht den Controller bei der GUI anmelden sollen, sondern genau anders herum.
Funktioniert wunderbar und somit auch für diverse Frames.

Super. Viele Grüße
Jan
 
Zuletzt bearbeitet:
Zurück