Zugriff auf Components aus einem ActionListener

  • Themenstarter Themenstarter _VisioN_
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
V

_VisioN_

Gast
Hallo,

ein Swing-Neuling braucht mal wieder Eure Hilfe.

Also, ich habe mir eine GUI nach dem MVC-Pattern erstellt.

Nun habe ich als GUI eine MDI-Anwendung - d.h. ich habe ein JFrame als Desktop und darin 2 JInternalFrame als Kindfenster.

In einen JInternalFrame habe ich jetzt z.B. einen Dialog, wo ein paar JTextField und ein JButton sind.

Code:

Auszug aus dem JFrame:
Code:
                //ChildFrame3 createStudent
		GridBagLayout gridbaglayout2 = new GridBagLayout();
		GridBagConstraints gridbagconstraints2;
		childframe3.getContentPane().setLayout(gridbaglayout2);
		
		JPanel panel3 = new JPanel();
		JLabel studentlabel = new JLabel("Student");
		panel3.add(studentlabel);
		gridbagconstraints2 = makeGridBagConstraints(0, 0, 2, 1);
		gridbaglayout2.setConstraints(panel3, gridbagconstraints2);
		childframe3.getContentPane().add(panel3);
		
		JPanel panel4 = new JPanel();		
		JLabel matrikelnummerlabel = new JLabel("Matrikelnummer: ");
		JTextField matrikelnummertextfield = new JTextField(50);
		panel4.add(matrikelnummerlabel);
		panel4.add(matrikelnummertextfield);		
		gridbagconstraints2 = makeGridBagConstraints(0, 1, 2, 1);
		gridbaglayout2.setConstraints(panel4, gridbagconstraints2);
		childframe3.getContentPane().add(panel4);
		
		JPanel panel5 = new JPanel();
		JLabel vornamelabel = new JLabel("Vorname: ");		
		JTextField vornametextfield = new JTextField(50);
		panel5.add(vornamelabel);
		panel5.add(vornametextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 2, 2, 1);
		gridbaglayout2.setConstraints(panel5, gridbagconstraints2);
		childframe3.getContentPane().add(panel5);
		
		JPanel panel6 = new JPanel();
		JLabel nachnamelabel = new JLabel("Nachname: ");
		JTextField nachnametextfield = new JTextField(50);
		panel6.add(nachnamelabel);
		panel6.add(nachnametextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 3, 2, 1);
		gridbaglayout2.setConstraints(panel6, gridbagconstraints2);
		childframe3.getContentPane().add(panel6);
		
		JPanel panel7 = new JPanel();
		JLabel adresselabel = new JLabel("Adresse");
		panel7.add(adresselabel);
		gridbagconstraints2 = makeGridBagConstraints(0, 4, 2, 1);
		gridbaglayout2.setConstraints(panel7, gridbagconstraints2);
		childframe3.getContentPane().add(panel7);

		JPanel panel8 = new JPanel();
		JLabel strasselabel = new JLabel("Strasse: ");
		JTextField strassetextfield = new JTextField(50);
		panel8.add(strasselabel);
		panel8.add(strassetextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 5, 2, 1);
		gridbaglayout2.setConstraints(panel8, gridbagconstraints2);
		childframe3.getContentPane().add(panel8);
		
		JPanel panel9 = new JPanel();
		JLabel nrlabel = new JLabel("Nr: ");
		JTextField nrtextfield = new JTextField(50);
		panel9.add(nrlabel);
		panel9.add(nrtextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 6, 2, 1);
		gridbaglayout2.setConstraints(panel9, gridbagconstraints2);
		childframe3.getContentPane().add(panel9);
		
		JPanel panel10 = new JPanel();
		JLabel plzlabel = new JLabel("PLZ: ");
		JTextField plztextfield = new JTextField(50);
		panel10.add(plzlabel);
		panel10.add(plztextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 7, 2, 1);
		gridbaglayout2.setConstraints(panel10, gridbagconstraints2);
		childframe3.getContentPane().add(panel10);
		
		JPanel panel11 = new JPanel();
		JLabel ortlabel = new JLabel("Ort: ");
		JTextField orttextfield = new JTextField(50);
		panel11.add(ortlabel);
		panel11.add(orttextfield);
		gridbagconstraints2 = makeGridBagConstraints(0, 8, 2, 1);
		gridbaglayout2.setConstraints(panel11, gridbagconstraints2);
		childframe3.getContentPane().add(panel11);
		
		JPanel panel12 = new JPanel();
		JButton createstudent = new JButton("createStudent");
		panel12.add(createstudent);
		gridbagconstraints2 = makeGridBagConstraints(0, 9, 2, 1);
		gridbaglayout2.setConstraints(panel12, gridbagconstraints2);
		childframe3.getContentPane().add(panel12);

Nun habe ich in dieser Klasse auch einen ActionListener, der dann reagieren soll, wenn jemand den JButton("createStudent") anclickt.
In diesen ActionListener will ich nun aber die JTextField auslesen und einer Methode im Controller übergeben - wie geht das?

Code:

Auszug aus dem ActionListener:

Code:
                else if (command == "createStudent") {
                //wie komme ich jetzt an die JTextField, um der Controllermethode addStudent(String matrikelnummer,
                //String vorname, String nachname, String strasse, String nr, String plz, String ort) den Inhalt der
                //JTextField zu übergeben?
                }
 
öha, solche sachen wie addStudent(..) haben im Controller nix zu suchen!
Der Controller holt lediglich die Daten von der View und gibt diese ans model weiter....

Den Controller kannste als private klasse in deinem JFrame machen....
dann noch das Textfeld, wovon du Daten brauchst als private klassenvariable
deklarieren.

nun kannst du im Controller dir die Daten aus dem Textfeld holen...
die Businesslogik alla addStudent(...) usw, kommt ins model..
Die View kennt das model, womit du dann im Controller sowas wie
Code:
model.addStudent(...);

machen kannst...
 
Dann habe ich das MVC-Pattern nicht verstanden 😉

Also, ich habe jetzt folgendes verstanden(glaube ich zumindest):

Ich habe 4 Klassen Thema, Student, Kenntniss und Adresse - das sind meine Daten.
Objekte dieser Klassen werden nicht im Controller verwaltet, sondern ich mache mir z.B. eine Klasse Model,
die dann diese Objekte, z.B. ArrayList studenten = new ArrayList; ... verwaltet und auch die Zugriffsoperationen auf diese, z.B.
Code:
public void addStudent(String matrikelnummer,
				 String vorname,
				 String nachname,
				 String strasse,
				 String nr,
				 String plz,
				 String ort) {
	Adresse adresse;
	Student student;
		
	adresse = new Adresse(strasse, nr, plz, ort);
	student = new Student(matrikelnummer, vorname, nachname, adresse);
	this.studenten.add(student);
}

oder bleibt die dann doch im Controller?

Das JFrame hat 2 Bereiche.
Oben habe ich JButton, um Befehle auszuführen und je nach Befehl, verändert sich der untere
Bereich - ein anderes ChildFrame wird angezeigt.

Wenn ich Dich jetzt verstanden habe, dann mache ich mir für jedes ChildFrame je nach Befehl eine Klasse(abgeleitet aus JInternalFrame), in der ich das jeweilige Aussehen(Textfelder, Buttons, ...) beschreibe und für die relevanten Componenten private Klassenvariablen anlege, die ich dann später problemlos auslesen kann?

Danke
 
Naja, der generelle Aufbau sollte ungefähr so sein:

- Businessobjekt (z. B. Student mit getter und setter (Adresse, Name usw.))

- Managerklasse (kann alles mögliche sein, bei dir: StudentenAccessManager z. B... der übernimmt Aufgaben, wie addStudent(), updateStudent(), deleteStudent(), getStudentById(), getAllStudenten() usw.; manche nennen das DAO..)

- Model (könnte ne Methode haben wie z. b. zeigeMirAlleStudenten() weil du auf der Gui z. B. ne Liste hättest, die dir alle Studenten anzeigen soll... Das Model macht jetzt nix anderes wie getAllStudenten() aufzurufen... Wenn das model alles hat, benachrichtigt es alle Views, die registriert sind, und gibt die neuen Daten mit, müssen die Daten irgendwie noch aufbereitet werden, dann passiert das hier... )

- View (zeigt alle Daten an)

- Controller (Holt die Daten von der View und gibt diese ans Model weiter... ist meist ne private Klasse deiner View.)


Der Guiaufbau ansich mit JFrames etc. in eigenen Klassen usw. hat mit diesem generellen Prinzip erstmal nix zu tun... das ist nochmal ne andere Baustelle mit ganz anderen Möglichkeiten.

Dir würde ich empfehlen, die Gui erstmal in einer Klasse zu lassen und schauen, ob der Datenaustausch irgendwann funktioniert... Wenn du dann mehr machen willst (Gui wird immer komplexer), kannst du anfangen, die Gui nochmal zu strukturieren und zu unterteilen.... nicht alles auf einmal. 🙂

Die ganze Thematik is net sooo easy und braucht sicher etwas Übung bis alles funzt....
Einfach ausprobieren... aber die Grundstruktur sollte vorhanden sein... sonst wirds übel! :wink:
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben