Einen wunderschönen Guten Tag,
ich habe mich zwischenzeitlich mit einem anderen kleinen Problem befasst, was nun wunderbar läuft und muss nun nochmal hier nachfragen.
Das Speichermanagement in meinem Projekt läuft hervorragend, sowohl das auslesen, als auch das abspeichern.
Ich habe es ehrlich gesagt immer noch nicht hinbekommen pauschal alle Werte der Textdatei abzufragen, aber das ist erstmal nicht weiter wild, ich frage sie halt alle einzeln ab. Tut erstmal keinen Zwang.
Wie ich nun die Werte auslese, ist mir bekannt.
Jedoch würde ich gerne eine Sache noch wissen, die unentbehrlich für mein Speichermanagement ist.
Ich lasse die Liste meiner 100 Gastkarten in einer Liste speichern und dann in einer jList ausgeben.
Das ganze habe ich hier in diesem Thema erledigt: http://forum.byte-welt.net/threads/13191-jList-Shuffle/page2?p=104814&viewfull=1#post104814
Ich würde an dieser Stelle gerne wissen, wie ich ganze Listen sinnvoll und ohne größere Aufwände mit in die Textdatei abspeichere und auch wieder einlese.
Wie gesagt, es sind 100 Werte, da jetzt irgendwie alles einzeln versuchen abzuspeichern, wie ich es bisher gemacht habe, wäre fahrlässig und dumm.
Meine Javadatei sieht folgendermaßen aus:
import java.awt.Container;
import java.awt.Dimension;
import java.awt.Insets;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowEvent;
import java.awt.event.WindowListener;
import java.io.BufferedReader;
import java.io.FileNotFoundException;
import java.io.FileReader;
import java.io.FileWriter;
import java.io.IOException;
import java.io.Reader;
import java.util.*;
import javax.swing.DefaultListModel;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JList;
import javax.swing.JOptionPane;
import javax.swing.JScrollPane;
import javax.swing.JTextField;
import javax.swing.WindowConstants;
import static spiel.Gastkarte.*;
public class CafeRoot extends JFrame {
private static final long serialVersionUID = 2463407896592093246L;
// Anfang Attribute
private int spielangefangen = 0;
private int restkartentisch = 0;
private int restkartengast = 0;
private int restbarplaetze = 0;
private int handkartenspieler1 = 0;
private int handkartenspieler2 = 0;
private int punktespieler1 = 0;
private int punktespieler2 = 0;
private int spieler = 0;
private String spielername1 = "Spieler 1";
private String spielername2 = "Spieler 2";
private List<Gastkarte> gastkarten = new ArrayList<Gastkarte>();
private JList<Gastkarte> jListGastkarten = new JList<Gastkarte>();
private DefaultListModel<Gastkarte> jListGastkartenModel = new DefaultListModel<Gastkarte>();
private JScrollPane jListGastkartenScrollPane= new JScrollPane(jListGastkarten);
private JLabel jLabelRestkartenTisch = new JLabel();
private JLabel jLabelRestkartenGast = new JLabel();
private JLabel jLabelRestbarplaetze = new JLabel();
private JLabel jLabelHandkartenSpieler1 = new JLabel();
private JLabel jLabelHandkartenSpieler2 = new JLabel();
private JLabel jLabelPunkteSpieler1 = new JLabel();
private JLabel jLabelPunkteSpieler2 = new JLabel();
private JLabel jLabelSpieler = new JLabel();
private boolean spielernamenkorrekt = false;
private JButton jButtonNeustart = new JButton();
// Ende Attribute
public CafeRoot(String title) throws IOException {
// Frame-Initialisierung
super(title);
setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
Reader reader = new BufferedReader(new FileReader("neuesspiel.txt"));
Properties neuesspiel = new Properties();
try {
neuesspiel.load(reader);
}catch(FileNotFoundException ex){
ex.printStackTrace();
System.out.println("Die Datei neuesspiel.txt existiert nicht!");
}
reader.close();
Reader reader2 = new BufferedReader(new FileReader("spielstand.txt"));
Properties spielstand = new Properties();
try {
spielstand.load(reader2);
}catch(FileNotFoundException ex){
ex.printStackTrace();
System.out.println("Die Datei spielstand.txt existiert nicht!");
}
reader.close();
int frameWidth = 506;
int frameHeight = 434;
setSize(frameWidth, frameHeight);
Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
int x = (d.width - getSize().width) / 2;
int y = (d.height - getSize().height) / 2;
setLocation(x, y);
setResizable(false);
Container cp = getContentPane();
setTitle("Café International");
setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);
setLocationRelativeTo(null);
cp.setLayout(null);
// Anfang Komponenten
jLabelRestkartenTisch.setBounds(25, 10, 100, 30);
cp.add(jLabelRestkartenTisch);
jLabelRestkartenGast.setBounds(25, 35, 100, 30);
cp.add(jLabelRestkartenGast);
jLabelRestbarplaetze.setBounds(25, 60, 120, 30);
cp.add(jLabelRestbarplaetze);
jLabelHandkartenSpieler1.setBounds(25, 85, 140, 30);
cp.add(jLabelHandkartenSpieler1);
jLabelHandkartenSpieler2.setBounds(25, 110, 140, 30);
cp.add(jLabelHandkartenSpieler2);
jLabelPunkteSpieler1.setBounds(25, 135, 140, 30);
cp.add(jLabelPunkteSpieler1);
jLabelPunkteSpieler2.setBounds(25, 160, 140, 30);
cp.add(jLabelPunkteSpieler2);
jLabelSpieler.setBounds(25, 185, 140, 30);
cp.add(jLabelSpieler);
jListGastkarten.setModel(jListGastkartenModel);
jListGastkartenScrollPane.setBounds(25, 210, 300, 100);
cp.add(jListGastkartenScrollPane);
jButtonNeustart.setBounds(320, 16, 105, 41);
jButtonNeustart.setText("Nouveau!");
jButtonNeustart.setMargin(new Insets(2, 2, 2, 2));
jButtonNeustart.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent evt) {
try {
jButtonNeustart_ActionPerformed(evt);
} catch (IOException e) {
e.printStackTrace();
}
}
});
cp.add(jButtonNeustart);
//=============================
String string_spielangefangen = spielstand.getProperty("spielangefangen", "0");
int spielangefangen = Integer.parseInt(string_spielangefangen);
if(spielangefangen == 0) {
do{
namensfrage();
}while(spielernamenkorrekt == false);
System.out.println("Spieler 1 heißt: "+spielername1);
System.out.println("Spieler 2 heißt: "+spielername2);
neuesspiel();
gastkartenmischen();
}
else{
spielstand();
}
// Ende Komponenten
setVisible(true);
addWindowListener(new MyWindowListener(this, spielstand));
//=============================
Random wuerfel1 = new Random(); //Würfeltest
int wuerfel = wuerfel1.nextInt(49)+1; //Würfeltest
System.out.println(wuerfel);
}
// Anfang Methoden
public void jButtonNeustart_ActionPerformed(ActionEvent evt) throws IOException {
final JFrame Neustart = new JFrame("Ein Frame zum Schließen");
Neustart.setTitle("Spiel neustarten");
Object[] options = {"Neustarten", "Abbrechen"};
int neustart = JOptionPane.showOptionDialog(null,
"Möchtest Du das Spiel wirklich neustarten?
Dein Spielstand wird verloren gehen!",
"Café International neustarten?",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if(neustart == 0) {
gastkarten.clear();
jListGastkartenModel.clear();
neuesspiel();
gastkartenmischen();
}
}
private void neuesspiel() throws IOException{
Reader reader = new BufferedReader(new FileReader("neuesspiel.txt"));
Properties neuesspiel = new Properties();
try {
neuesspiel.load(reader);
}catch(FileNotFoundException ex){
ex.printStackTrace();
System.out.println("Die Datei neuesspiel.txt existiert nicht!");
}
reader.close();
String string_restkartentisch = neuesspiel.getProperty("restkartentisch", "24");
restkartentisch = Integer.parseInt(string_restkartentisch);
jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
String string_restkartengast = neuesspiel.getProperty("restkartengast", "0");
restkartengast = Integer.parseInt(string_restkartengast);
jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
String string_restbarplaetze = neuesspiel.getProperty("restbarplaetze", "21");
restbarplaetze = Integer.parseInt(string_restbarplaetze);
jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
String string_handkartenspieler1 = neuesspiel.getProperty("handkartenspieler1", "0");
handkartenspieler1 = Integer.parseInt(string_handkartenspieler1);
jLabelHandkartenSpieler1.setText("Karten "+spielername1+": "+handkartenspieler1);
String string_handkartenspieler2 = neuesspiel.getProperty("handkartenspieler2", "0");
handkartenspieler2 = Integer.parseInt(string_handkartenspieler2);
jLabelHandkartenSpieler2.setText("Karten "+spielername2+": "+handkartenspieler2);
String string_punktespieler1 = neuesspiel.getProperty("punktespieler1", "0");
punktespieler1 = Integer.parseInt(string_punktespieler1);
jLabelPunkteSpieler1.setText("Punkte "+spielername1+": "+punktespieler1);
String string_punktespieler2 = neuesspiel.getProperty("punktespieler2", "0");
punktespieler2 = Integer.parseInt(string_punktespieler2);
jLabelPunkteSpieler2.setText("Punkte "+spielername2+": "+punktespieler2);
String string_spieler = neuesspiel.getProperty("spieler", "1");
spieler = Integer.parseInt(string_spieler);
if(spieler == 1){
jLabelSpieler.setText("Am Zug: "+spielername1);
}
else{
jLabelSpieler.setText("Am Zug: "+spielername2);
}
System.out.println("Neues Spiel gestartet");
}
private void spielstand() throws IOException{
Reader reader2 = new BufferedReader(new FileReader("spielstand.txt"));
Properties spielstand = new Properties();
try {
spielstand.load(reader2);
}catch(FileNotFoundException ex){
ex.printStackTrace();
System.out.println("Die Datei spielstand.txt existiert nicht!");
}
reader2.close();
JOptionPane.showMessageDialog(null, "Ein Zwischengespeichertes Spiel wird wiederhergestellt!", "Weiterspielen", JOptionPane.INFORMATION_MESSAGE);
String spielername1 = spielstand.getProperty("spielername1", "Nicht vorhanden");
String spielername2 = spielstand.getProperty("spielername2", "Nicht vorhanden");
String string_restkartentisch = spielstand.getProperty("restkartentisch", "0");
restkartentisch = Integer.parseInt(string_restkartentisch);
jLabelRestkartenTisch.setText("Resttische: "+restkartentisch);
String string_restkartengast = spielstand.getProperty("restkartengast", "0");
restkartengast = Integer.parseInt(string_restkartengast);
jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
String string_restbarplaetze = spielstand.getProperty("restbarplaetze", "21");
restbarplaetze = Integer.parseInt(string_restbarplaetze);
jLabelRestbarplaetze.setText("Barplätze übrig: "+restbarplaetze);
String string_handkartenspieler1 = spielstand.getProperty("handkartenspieler1", "0");
handkartenspieler1 = Integer.parseInt(string_handkartenspieler1);
jLabelHandkartenSpieler1.setText("Karten "+spielername1+": "+handkartenspieler1);
String string_handkartenspieler2 = spielstand.getProperty("handkartenspieler2", "0");
handkartenspieler2 = Integer.parseInt(string_handkartenspieler2);
jLabelHandkartenSpieler2.setText("Karten "+spielername2+": "+handkartenspieler2);
String string_punktespieler1 = spielstand.getProperty("punktespieler1", "0");
punktespieler1 = Integer.parseInt(string_punktespieler1);
jLabelPunkteSpieler1.setText("Punkte "+spielername1+": "+punktespieler1);
String string_punktespieler2 = spielstand.getProperty("punktespieler2", "0");
punktespieler2 = Integer.parseInt(string_punktespieler2);
jLabelPunkteSpieler2.setText("Punkte "+spielername2+": "+punktespieler2);
String string_spieler = spielstand.getProperty("spieler", "1");
spieler = Integer.parseInt(string_spieler);
if(spieler == 1){
jLabelSpieler.setText("Am Zug: "+spielername1);
}
else{
jLabelSpieler.setText("Am Zug: "+spielername2);
}
System.out.println("Ein altes Spiel wurde wiederhergestellt");
}
private void namensfrage() {
JTextField spielername01 = new JTextField(new MaxSizeDocument(12), "", 0);
JTextField spielername02 = new JTextField(new MaxSizeDocument(12), "", 0);
Object[] namensfrage = {"Name von Spieler 1", spielername01, "Name von Spieler 2", spielername02};
JOptionPane pane = new JOptionPane(namensfrage, JOptionPane.PLAIN_MESSAGE, JOptionPane.DEFAULT_OPTION);
pane.createDialog(null, "Wie heißen die Spieler?").setVisible(true);
spielername1 = spielername01.getText();
spielername2 = spielername02.getText();
if(spielername1.equals("") || spielername2.equals("")) {
JOptionPane.showMessageDialog(null, "Bitte gib beide Spielernamen ein!", "Unvollständige Eingabe", JOptionPane.ERROR_MESSAGE);
System.out.println("Es wurden nicht alle Spielernamen eingetragen");
namensfrage();
}
else if(spielername1.equalsIgnoreCase(spielername2)) {
JOptionPane.showMessageDialog(null, "Bitte benenne die Spieler unterschiedlich!", "Namensgleichheit", JOptionPane.ERROR_MESSAGE);
System.out.println("Es wurde bei beiden Namen \""+spielername1+"\" eingetragen");
namensfrage();
}
else{
spielernamenkorrekt = true;
}
}
private void gastkartenmischen() {
for(int j=0;j<2;j++){
for(Land land : Land.values()) {
int anzahl = 2;
if (land == Land.Joker) {
anzahl = 1;
}
for(int i = 0; i < anzahl; i++) {
for(Geschlecht geschlecht : Geschlecht.values()) {
gastkarten.add(new Gastkarte(geschlecht, land));
restkartengast = restkartengast + 1;
}
}
}
}
/*Gastkarte eineGastkarte = gastkarten.get(0);
Geschlecht geschlecht = eineGastkarte.geschlecht;
Land land = eineGastkarte.land;
if(land == Land.Chinese) {
System.out.println("Nihao!");
}*/
jLabelRestkartenGast.setText("Restgäste: "+restkartengast);
Collections.shuffle(gastkarten);
for(int n=0;n<gastkarten.size();n++){
jListGastkartenModel.addElement(gastkarten.get(n));
}
System.out.println("Die Gastkarten wurden gemischt");
System.out.println(gastkarten);
}
// Ende Methoden
public static void main(String[] args) throws IOException {
new CafeRoot("CafeRoot");
} // end of main
public class MyWindowListener implements WindowListener {
private Properties spielstand;
private CafeRoot cRoot;
public MyWindowListener(CafeRoot cRoot,Properties spielstand) {
this.cRoot = cRoot;
this.spielstand = spielstand;
}
@Override
public void windowActivated(WindowEvent arg0) { }
@Override
public void windowClosed(WindowEvent arg0) {
cRoot.setVisible(false);
}
@Override
public void windowClosing(WindowEvent evt)
{
final JFrame Beenden = new JFrame("Ein Frame zum Schließen");
Beenden.setTitle("Spiel beenden");
Object[] options = {"Speichern", "Beenden", "Abbrechen"};
int beenden = JOptionPane.showOptionDialog(null,
"Möchtest Du das Spiel wirklich beenden?
Dein Spielstand wird verloren gehen!",
"Café International beenden?",
JOptionPane.DEFAULT_OPTION,
JOptionPane.QUESTION_MESSAGE,
null, options, options[0]);
if(beenden == 0)
{
try {
spielangefangen = 1;
spielstand.setProperty("spielangefangen",spielangefangen + "");
spielstand.setProperty("restkartentisch",restkartentisch + "");
spielstand.setProperty("restkartengast",restkartengast + "");
spielstand.setProperty("restbarplaetze",restbarplaetze + "");
spielstand.setProperty("handkartenspieler1",handkartenspieler1 + "");
spielstand.setProperty("handkartenspieler2",handkartenspieler2 + "");
spielstand.setProperty("punktespieler1",punktespieler1 + "");
spielstand.setProperty("punktespieler2",punktespieler2 + "");
spielstand.setProperty("spielername1",spielername1);
spielstand.setProperty("spielername2",spielername2);
spielstand.setProperty("spieler",spieler + "");
spielstand.store(new FileWriter("spielstand.txt"),"Gespeichertes Spiel");
System.out.println("Das Spiel wurde beendet und der Spielstand abgespeichert");
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
else{
if(beenden == 1) {
try {
spielangefangen = 0;
spielstand.setProperty("spielangefangen",spielangefangen + "");
spielstand.store(new FileWriter("spielstand.txt"),"Keine Speicherdatei");
System.out.println("Das Spiel wurde beendet, aber kein Spielstand gespeichert");
} catch (IOException e) {
e.printStackTrace();
}
System.exit(0);
}
}
}
@Override
public void windowDeactivated(WindowEvent arg0) { }
@Override
public void windowDeiconified(WindowEvent arg0) { }
@Override
public void windowIconified(WindowEvent arg0) { }
@Override
public void windowOpened(WindowEvent arg0) { }
}
} // end of class CafeRoot
Die Klasse Gastkarte hat diesen Inhalt:
public class Gastkarte {
public static enum Geschlecht {männlich, weiblich};
public static enum Land {Deutscher, Franzake, Brite, Amerikaner, Türke, Inder, Chinese, Russe, Spanier, Kubaner, Afrikaner, Italiener, Joker};
public final Land land;
public final Geschlecht geschlecht;
public Gastkarte(Geschlecht geschlecht, Land land){
this.land = land;
this.geschlecht= geschlecht;
}
public String toString(){
return land + ":" + geschlecht;
}
}
Nun überlege ich 1. wie ich das ganze abspeichern möchte und 2. wie ich das Codetechnisch bewerkstellige.
Ich hätte zwei Varianten als Ideen:
er speichert entweder in 100 Zeilen jeweils Paare ab: gastkarte1:deutscher,männlich
;gastkarte2:brite,weiblich
.
Das ist natürlich umständlich und hat sicherlich eine längere Laufzeit.
Eine Alternatividee wäre, dass er nach dem Altbekannten Modell absucht, wo gastkarten:
steht und dann getrennt durch Kommata oder Semikola alle 100 auflistet: gastkarten:brite,männlich;deutscher,männlich;ami,weiblich
Das zweite wäre natürlich sicherlich Speicherplatzärmer und mit einer besseren Laufzeit behaftet.
Hat jemand eine kluge Idee, wie man das alles nett umsetzen kann?
Zu beachten: Es handelt sich um Gastkarten, die aus zwei Elementen bestehen, also Land und Geschlecht, es darf nicht sein, dass diese nach dem Wiederherstellen ein einziger Einheitsbrei sind, die sich nicht mehr getrennt voneinander behandeln und abfragen lassen.
Danke und einen schönen Tag noch.
Bussy
Lukas