Fensterinhalt aktualisieren

balu2000

Grünschnabel
Hallo Leute,

ich benutze das erste mal AWT und stehe vor einem Problem:

Mein Programm soll die Möglichkeit bieten durch verschiedene Elemente (in Form von Objekten) eines Vektors zu "blättern" dazu habe ich einen "weiter" und "zurück" Button erstellt, der den Index des angezeigten Datensatzes de- bzw. inkrementiert.

Mein Problem ist nun: wie kann ich das Fenster nach Änderung des Index aktualisieren, so dass nun der nächste bzw. vorherige Datensatz angezeigt wird?
Wenn ich einfach init() in die actionPerformed Methode schreibe, wird der korrekte Datensatz zwar angezeigt aber unter dem alten Datensatz. D.h. es wird einfach ein neues (aktualisiertes) Frame unter das alte gehängt.
Auch wenn ich vorher dispose() aufrufe wird das alte nicht gelöscht.

Vorschläge?
 
Hallo,

ich schätze mal, dass du die Daten aus dem Vector nur anzeigen möchtest. Dann kannst du doch einfach auf den Button einen ActionListener legen, der den Index hoch bzw runter zählt und dann die Daten neu in die Textfelder oder was auch immer zum anzeigen genommen wird setzen.

MFG

zEriX
 
Genau so mache ich das auch.

Allerdings weiß ich nicht, wie ich nicht wie ich die neuen Daten dann anzeigen lassen kann.
Wenn ich init() wieder aufrufe (mit den geänderten Daten), wird einfach das neue Frame unter das alte gesetzt anstatt das alte zu ersetzen.
 
Dann mach dir doch einfach eine Methode in denen nur die Daten gesetzt werden. Also du darfst da keine neuen Objecte anlegen, sondern einfach in den alten Objecten die Daten neu setzen.

Wäre vielleicht gut, wenn du mal den Quellcode postest, dann sehe ich mal was du in der init()-Methode machst.

MFG

zEriX
 
Hier ist mein Code:

Code:
package se;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.OptionalDataException;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Vector;

public class StudentGUI extends Frame implements ActionListener, WindowListener {
	private Button neu;
	private Button weiter;
	private Button zurueck;
	private Label labMatNr;
	private Label labVor;
	private Label labNach;
	private TextField txtMatNr;
	private TextField txtVor;
	private TextField txtNach;
	private int index = 1;



	public StudentGUI(String s) {
		super(s);
	}

	public void init() throws HeadlessException, OptionalDataException,
			ClassNotFoundException, IOException {
		StudentenVerwaltung recoveredClass = StudentenVerwaltung
				.fromFile("studenten.dat");
		Student student = (Student) recoveredClass.list.get(index);
		setLayout(new FlowLayout());
		labMatNr = new Label("Mat.Nr.: " + student.matrikelnummer);
		txtMatNr = new TextField(6);
		labVor = new Label("Vorname: " + student.vorname);
		txtVor = new TextField(20);
		labNach = new Label("Nachname: " + student.nachname);
		txtNach = new TextField(20);
		neu = new Button("Neu");
		neu.addActionListener(this);
		weiter = new Button("Weiter");
		weiter.addActionListener(this);
		zurueck = new Button("Zurück");
		zurueck.addActionListener(this);
		add(labMatNr);
		add(txtMatNr);
		add(labVor);
		add(txtVor);
		add(labNach);
		add(txtNach);
		add(neu);
		add(zurueck);
		add(weiter);
		addWindowListener(this);
		setSize(200, 300); // or: pack();
		setVisible(true);
	}

	public static void main(String[] args) throws HeadlessException,
			OptionalDataException, ClassNotFoundException, IOException {
		StudentGUI f = new StudentGUI("Test");
		f.init();
	}

	public void actionPerformed(ActionEvent e) {
		try {
			StudentenVerwaltung recoveredClass = StudentenVerwaltung
			.fromFile("studenten.dat");
			if (e.getSource().equals(neu)) {
				String neuMatNr = txtMatNr.getText();
				String neuVor = txtVor.getText();
				String neuNach = txtNach.getText();
				recoveredClass
						.addStudent(new Student(neuMatNr, neuVor, neuNach));
				Student student = (Student) recoveredClass.list.lastElement();
				System.out.println(student.matrikelnummer);
				txtMatNr.setText("");
				txtVor.setText("");
				txtNach.setText("");
				labMatNr = new Label("Mat.Nr.: " + student.matrikelnummer);
				labMatNr = new Label("Mat.Nr.: " + student.matrikelnummer);
				labVor = new Label("Vorname: " + student.vorname);
				labNach = new Label("Nachname: " + student.nachname);
			} else if (e.getSource().equals(zurueck)) {
				//Student vorigerStudent = (Student) recoveredClass.list.get(0);
				index--;
				dispose();
				init();
				//labMatNr = new Label("Mat.Nr.: " + vorigerStudent.matrikelnummer);
				//labVor = new Label("Vorname: " + vorigerStudent.vorname);
				//labNach = new Label("Nachname: " + vorigerStudent.nachname);
				//add(labMatNr);
				//add(labVor);
				//add(labNach);
				
			}
		} catch (OptionalDataException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (ClassNotFoundException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		} catch (IOException e1) {
			// TODO Auto-generated catch block
			e1.printStackTrace();
		}

	}

	public void windowClosing(WindowEvent e) {

		dispose();
		System.exit(0);
	}

	public void windowClosed(WindowEvent e) {
	}

	public void windowOpened(WindowEvent e) {
	}

	public void windowIconified(WindowEvent e) {
	}

	public void windowDeiconified(WindowEvent e) {
	}

	public void windowActivated(WindowEvent e) {
	}

	public void windowDeactivated(WindowEvent e) {
	}

Wie man sehen kann, hab ich in der "actionPerformed" Methode mehrere Sachen ausprobiert um den Inhalt des Frames zu ändern. Hat bisher alles nicht geklappt.
 
Es ist genau wie ich gesagt hab, du legst immer wieder neue Objecte an. Du brauchst nur mit setText die Werte neu zu setzen, mehr musst du nicht machen um die neuen Daten anzuzeigen. Vor allem ist es falsch die init()-Methode aufzurufen, da du da ja das Fenster anlegst, also alle Objecte anlegst.

Am besten schreibst du dir eine Methode in denen die Daten gesetzt werden. Grob gesagt, darf in dieser Methode dann kein new mehr drin stehen, sondern eigentlich nur setText. Diese Methode kannst du dann in der init() und in der actionPerformed() aufrufen.

MFG

zEriX
 
Danke für die Hilfe ;)
Ich habe die Methode folgendermaßen angepasst:

Code:
package se;

import java.awt.*;
import java.awt.event.*;
import java.io.IOException;
import java.io.OptionalDataException;
import java.util.Collection;
import java.util.Enumeration;
import java.util.Vector;

public class StudentGUI extends Frame implements ActionListener, WindowListener {
	// private StudentenVerwaltung recoveredClass =
	// StudentenVerwaltung.fromFile("studenten.dat");
	private Button neu;
	private Button weiter;
	private Button zurueck;
	private Label labMatNr;
	private Label labVor;
	private Label labNach;
	private TextField txtMatNr;
	private TextField txtVor;
	private TextField txtNach;
	private int index = 1;
	StudentenVerwaltung recoveredClass = StudentenVerwaltung.fromFile("studenten.dat");
	Student student = (Student) recoveredClass.list.get(index);

	public StudentGUI(String s) {
		super(s);
	}

	public void init() throws HeadlessException, OptionalDataException,
			ClassNotFoundException, IOException {

		setLayout(new FlowLayout());
		labMatNr = new Label("Mat.Nr.: " + student.matrikelnummer);
		txtMatNr = new TextField(6);
		labVor = new Label("Vorname: " + student.vorname);
		txtVor = new TextField(20);
		labNach = new Label("Nachname: " + student.nachname);
		txtNach = new TextField(20);
		neu = new Button("Neu");
		neu.addActionListener(this);
		weiter = new Button("Weiter");
		weiter.addActionListener(this);
		zurueck = new Button("Zurück");
		zurueck.addActionListener(this);
		add(labMatNr);
		add(txtMatNr);
		add(labVor);
		add(txtVor);
		add(labNach);
		add(txtNach);
		add(neu);
		add(zurueck);
		add(weiter);
		addWindowListener(this);
		setSize(200, 300);
		setVisible(true);
	}

	public static void main(String[] args) throws HeadlessException,
			OptionalDataException, ClassNotFoundException, IOException {
		StudentGUI f = new StudentGUI("Test");
		f.init();
	}

	public void actionPerformed(ActionEvent e) {
		StudentenVerwaltung recoveredClass = StudentenVerwaltung
		.fromFile("studenten.dat");
		if (e.getSource().equals(neu)) {
			String neuMatNr = txtMatNr.getText();
			String neuVor = txtVor.getText();
			String neuNach = txtNach.getText();
			recoveredClass
					.addStudent(new Student(neuMatNr, neuVor, neuNach));
			Student student = (Student) recoveredClass.list.lastElement();
			System.out.println(student.matrikelnummer);
			txtMatNr.setText("");
			txtVor.setText("");
			txtNach.setText("");
			labMatNr = new Label("Mat.Nr.: " + student.matrikelnummer);
			labVor = new Label("Vorname: " + student.vorname);
			labNach = new Label("Nachname: " + student.nachname);
		} else if (e.getSource().equals(zurueck)) {;
			index--;
			System.out.println(student.matrikelnummer);
			labMatNr.setText("Mat.Nr.: " + student.matrikelnummer);
			labVor.setText("Vorname: " + student.vorname);
			labNach.setText("Nachname: " + student.nachname);

			
		}

	}

	public void windowClosing(WindowEvent e) {

		dispose();
		System.exit(0);
	}

	public void windowClosed(WindowEvent e) {
	}

	public void windowOpened(WindowEvent e) {
	}

	public void windowIconified(WindowEvent e) {
	}

	public void windowDeiconified(WindowEvent e) {
	}

	public void windowActivated(WindowEvent e) {
	}

	public void windowDeactivated(WindowEvent e) {
	}
}

Das Problem ist nun aber, dass er die Dekrementierung des Indexes (index--; ) nicht mitkriegt und einfach den gleichen Datensatz nochmal anzeigt.
 
Zuletzt bearbeitet:
Es bringt ja auch nichts, wenn du einfach nur index-- machst, wenn du dann den entsprechenden "Datensatz" nicht aus der Liste ausliest.

MFG

zEriX
 
Zurück