Speicherung des Inhalts von Textfeldern

AmadeusMag

Grünschnabel
Hallo,

ich programmiere mir zur Zeit ein eigenes Computerspiel als Java Applet. Am Anfang des Spiels kommt ein Menü indem ich ein Textfeld eingebaut habe. Dort soll man den Namen eingeben, welcher dann später im Spiel angezeigt wird und ausserdem notwendig ist für eine Bestenliste (die ich bisher noch nicht realisiert habe). Doch es ist mir nicht möglich den Inhalt des Textfeldes zu speichern, und ich finde den Fehler einfach nicht. Alles zu dem Textfeld ist in der Hauptklasse "Schneeballwurf_Spiel" , hier der Download zum kompletten Spiel :

Schneeballwurf

Alle Stellen die für das Textfeld wichtig sind habe ich mit // Textfeld kommentiert damit man sich besser zurecht findet.

Ich würde mich wirklich freuen wenn sich jemand in das (halb-fertige) Programm einarbeiten, und mir den Fehler mitteilen könnte.

Danke im voraus !
 
Hallo AmadeusMag!

Ich hab mir dein Spiel angeschaut. Du hast dir anscheinend viel Mühe gegeben! Ich würde dir jedoch dringend raten mehr zu kapseln.

Besorg dir ein ide wie z.B. eclipse (http://www.eclipse.org) das dir hilft dein Quelltext übersichtlicher zu notieren. Zu den keyListenern lies am besten mal folgendes Tutorial: http://java.sun.com/j2se/1.4.2/docs/api/java/awt/event/KeyListener.html

Zu deiner Frage der Persistierung. Am einfachsten ist die Persistierung eines serialisierten Objects per FileOutputStream.
Wesentlich eleganter sind jedoch xml-Dateien. Auf diese kann man per Javaklassen, die sich z.B. mit castor-xml (http://www.castor.org/) sehr leicht erzeugen lassen, zugreifen.
HTH TrueSun
 
Erstmal danke für die Antworten.
Aber sind KeyListener bei Textfeldern wirklich sinnvoll ? Ich versteh nicht warum getText() bei mir einfach nicht funktioniert.

Und zu der ganzen Struktur Sache: Ich schreibe das Programm für die Schule und da dürfen/können wir nur JavaEdit nehmen.

Ist Persistierung die Speicherung in externen Dateien ?
 
Original geschrieben von AmadeusMag
Ich versteh nicht warum getText() bei mir einfach nicht funktioniert.
Die Methode funktioniert auf jeden Fall.
Original geschrieben von AmadeusMag
Ist Persistierung die Speicherung in externen Dateien ?
Persistierung ist das Speichern im allgemeinen Sinne. Ein einfaches Beispiel geht wie folgt:

Code:
try {
	FileOutputStream fos = new FileOutputStream("dat.txt");
	ObjectOutputStream oos = new ObjectOutputStream(fos);
	oos.writeObject("Text");
	oos.close();
	fos.close();
} catch (Exception e) {
	e.printStackTrace();
}

Das Einlesen geht dann sehr ähnlich.

einTextField.remove() gibt es nicht. Was du machen willst ist wahrscheinlich: remove(einTextField). Du hast es ja schliesslich auch mit add(einTextField) dem applet hinzugefügt.

Gruss TrueSun
 
Moin!

Code:
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.BufferedReader;
import java.io.BufferedWriter;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTextArea;
import javax.swing.SwingUtilities;

/*
 * Created on 04.03.2004
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

/**
 * @author Darimont
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class TextSaver extends JFrame {

	private JButton btnladen, btnspeichern;
	private JTextArea jtarea;
	private JPanel panel;
	private JScrollPane scrollPane;
	

	private String fileName;

	public TextSaver() {
		super("TextSaver");
		setSize(512, 384);
		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent evt) {
				setVisible(false);
				dispose();
				System.exit(0);
			}
		});

		panel = new JPanel();
		panel.setSize(512,384);
		panel.setLayout(new FlowLayout());

				jtarea = new JTextArea();
		jtarea.setColumns(25);
		jtarea.setRows(18);
		
		scrollPane = new JScrollPane();
		scrollPane.setSize(320,240);
		scrollPane.getViewport().add(jtarea);
		
		btnladen = new JButton("laden");
		btnladen.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				loadText(fileName);
			}

		});

		btnspeichern = new JButton("speichern");

		btnspeichern.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent e) {
				// TODO Auto-generated method stub
				saveText(jtarea.getText());
			}
		});

		panel.add(scrollPane);
		panel.add(btnladen);
		panel.add(btnspeichern);

		getContentPane().add(panel);
		
		fileName = "textSave.txt";

		setVisible(true);
	}

	public static void main(String[] args) {
		new TextSaver();
	}

	private void saveText(String string) {
		// TODO Auto-generated method stub
		try {
			FileWriter fw = new FileWriter("c:/" + fileName);
			BufferedWriter bw = new BufferedWriter(fw);
			bw.write(string);
			bw.flush();
			bw.close();
			fw.close();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}

	private void loadText(String fileName) {
		// TODO Auto-generated method stub
		try {
			FileReader fr = new FileReader("c:/" + fileName);
			BufferedReader br = new BufferedReader(fr);
			String content = null;
			final StringBuffer buffer = new StringBuffer();

			while ((content = br.readLine()) != null) {
				buffer.append(content);
			}

			SwingUtilities.invokeLater(new Runnable() {
				public void run() {
					jtarea.setText(buffer.toString());
				}
			});

		} catch (FileNotFoundException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		} catch (IOException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}

	}
}

Gruß Tom
 
Hm den TextSaver könnte ich wohl einbauen, aber könnt ihr mir nicht sagen warum meine einfache Speicherung unter einer String-Variable nicht funktioniert ?

String name = eingabe_name.getText()

Das müsste doch eigentlich den im Textfeld eingegebenen Text unter der Variable name speichern, welche ich dann später ausgeben könnte - doch genau das funktioniert bei mir nicht.
 
Ausserdem wäre ich noch an einer Methode des TextSavers interessiert, welche in einer vorhandenen Textdatei neuen Inhalt hinzufügt, und nicht eine komplett neue Datei erstellt indem alte Daten nicht mehr erhalten bleiben.
 
Hallo!

Versuch das ganze doch mal mit ner Hashtable ...
Da legst du einfach als Schlüssel den Namen der Komponente (set/getName()) und als Wert den getText() Wert ab ...
Diese Informationen kannst du dann mit einem ObjectOutputStream / ObjectInputStream schreiben/bzw. wieder von der Platte lesen...

Gruß Tom
 
Ich habe es gerade versucht als Hashtable aber das funktioniert auch nicht, ich glaube dass getText() bei mir an der falschen Stelle im Programm kommt, aber ich habe schon alle Stellen die ich mir vorstellen kann ausprobiert und ich weiss nicht was ich falsch mache.
 
Hallo!

Versuch doch mal einen ganz anderen Ansatz, lass dein Applet am Ende des Spiels doch einfach eine URL öffnen, der du als parameter die jeweiligen Werte per HTTP-GET übergibst, die du speichern lassen willst. So kannst du dann deine Bestenliste Pflegen ... ohne das Applet zu signieren kannst du aber nur die URL's öffnen, die auf den selben Server zeigen, auf dem auch dein Applet liegt.

Hinter der URL kann sich dann beispielsweise ein PHP oder ASP oder ein Perl-Skript verbergen. Das ist in dieser Beziehung gänige Praxis. Hab ganz überlesen, dass du ein Applet gemacht hast. Deshalb vergiss mal bitte schnell die Möglichkeit das ganze in einer Datei zu speichern ... geht zwar auch (Signierte Jar's und Zertifikate) ist jedoch nciht der optimale Weg)

Gruß Tom
 

Neue Beiträge

Zurück