Guten Abend,
folgender Umstand:
Ich schreibe ein Programm um meine Anbauplanung im Garten zu "digitalisieren".
Ich speichere Daten in .txt Dateien. Das Laden und anzeigen funktioniert super. mit einem Dialogfenster kann ich diese Werte anzeigen und ändern, Dies verändert Größe und Position des JLabels auf dem JPanel. Alles super.
rufe ich nun die Daten ab um sie zu speichern, schreibt er die alten Daten (auch System.out.println gibt die alten Werte aus).
Main-Klasse (erzeugt DataHandler Objekt, startet den Planer und übergibt die zu verwendenden Beete):
Die Klasse hat noch nicht viel zu tun, da kommt später noch mehr
Diese Klasse stellt sowohl den Container in der das Beet angezeigt wird, als auch den Schnittpunkt um verschiedene Beete anzeigen zu lassen (kommt noch):
Klasse um alle Daten laden und speichern zu können:
Das Interface wird von jeder Klasse implementiert, die geladen oder gespeichert werden muss
Mir ist, als würde ich zwei Objekte erzeugen, das eine bearbeiten und zum speichern ein anderes der selben Klasse aufrufen. Ich kann aber seit Tagen keine doppelte Zuweisung o.ä. finden.
über Hilfe wäre ich sehr dankbar, ich hoffe das der Code reicht
MfG
folgender Umstand:
Ich schreibe ein Programm um meine Anbauplanung im Garten zu "digitalisieren".
Ich speichere Daten in .txt Dateien. Das Laden und anzeigen funktioniert super. mit einem Dialogfenster kann ich diese Werte anzeigen und ändern, Dies verändert Größe und Position des JLabels auf dem JPanel. Alles super.
rufe ich nun die Daten ab um sie zu speichern, schreibt er die alten Daten (auch System.out.println gibt die alten Werte aus).
Main-Klasse (erzeugt DataHandler Objekt, startet den Planer und übergibt die zu verwendenden Beete):
Java:
GH_start
{
public static DataHandler dh = new DataHandler();
public static void main (String[] args)
{
new Planer(dh.ladeBeete());
}
}
Die Klasse hat noch nicht viel zu tun, da kommt später noch mehr
Java:
public class Planer
{
ArrayList<Beet> beete;
public Planer(ArrayList<Beet> beete)
{
this.beete = beete;
new BeetAnsicht(beete).anzeigen(beete.get(0));
}
}
Diese Klasse stellt sowohl den Container in der das Beet angezeigt wird, als auch den Schnittpunkt um verschiedene Beete anzeigen zu lassen (kommt noch):
Java:
public class BeetAnsicht extends JDialog implements ActionListener, Daten
{
private static final long serialVersionUID = 8308404013997791137L;
ArrayList<Beet> beete;
public BeetAnsicht(ArrayList<Beet> beete)
{
this.beete = beete;
speichern.addActionListener(this);
}
@Override
public boolean speichern()
{
GH_start.dh.speichereBeete(beete);
return false;
}
public void actionPerformed(ActionEvent ae)
{
if(ae.getSource() instanceof JMenuItem)
{
if(ae.getSource() == speichern) this.speichern();
}
}
Klasse um alle Daten laden und speichern zu können:
Java:
public class DataHandler
{
static BufferedReader in;
static BufferedWriter out;
File pfad = new File(GH_start.pfad);
File[] dateien = pfad.listFiles();
URL url;
String s;
String[] sa;
int i;
DataHandler()
{
super();
}
/*------------------------------------- LADEN --------------------------------------------- */
public ArrayList<Beet> ladeBeete()
{
File f = new File(pfad.getAbsolutePath()+"/beete/");
ArrayList<Beet> bl = new ArrayList<Beet>();
//ERROR abfangen
if(f == null || !f.exists() || !f.isDirectory())
{
System.err.println("DH[60]:"+f+" Ordner existiert nicht!");
return null;
}
else if(f.listFiles().length == 0)
{
System.err.println("DH[65]: Ordner "+f.getAbsolutePath()+" ist leer!");
return null;
}
// ansonsten:
else
{
sa = null;
Beet b = null;
//
for(File file : f.listFiles())
{
try {
in = new BufferedReader(new FileReader(file));
//erste Zeile
s = in.readLine();
if(s!=null && !s.isBlank() && s.contains("#")) sa = s.split("#");
else
{
System.out.println("DH[84]: continued; beet = "+b);
continue;
}
b = new Beet(file.getName(),
sa[0].split("x"),
Integer.parseInt(sa[1]),
Integer.parseInt(sa[2]),
sa[3], sa[4]);
//zweite Zeile, dritte, ...
//Endivie#101,60#1#1
//name # x , y#ausr#anzahl
String str = in.readLine();
String[] point;
Pflanze p;
while(str != null && !str.isBlank())
{
sa = str.split("#");
p = null;
p = GH_start.getPflanze(sa[0]);
point = sa[1].split(",");
if(p!=null)
{
if(point != null && point.length==2)
p.setLocation(Integer.parseInt(point[0]), Integer.parseInt(point[1]));
else System.err.println("DH[112] : Point null oder length != 2");
if(sa[2] != null && !sa[2].isBlank())
p.setAusrichtung(Integer.parseInt(sa[2]));
else System.err.println("DH[115] : sa[2] null oder isBlank");
if(sa[3] != null && !sa[3].isBlank())
p.setAnzahl(Integer.parseInt(sa[3]));
else System.err.println("DH[118] : sa[3] null oder isBlank");
b.addReihe( p,
new Point(p.getX(),p.getY()),
Integer.parseInt(sa[2]));
}
else System.err.println("DH [112] Pflanze aus PflLi == null");
str = in.readLine();
}
in.close();
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
bl.add(b);
}
return bl;
}
}
public ArrayList<Pflanze> ladePflanzen()
{
System.out.println("DH [142]: lade Pflanzen...");
File f = new File(pfad.getAbsolutePath()+"/Pflanzen/Liste.txt");
ArrayList<Pflanze> pl = new ArrayList<Pflanze>();
if(f == null || !f.exists())
{
System.err.println("DH[149]:"+f+" Datei existiert nicht!");
return null;
}
else
{
try {
in = new BufferedReader(new FileReader(f));
for(s = in.readLine(); s!=null&&!s.isBlank(); s = in.readLine())
{
//name#abstand#düngung#sonne#ph#saat#pfl#ernte
sa = s.split("#");
if(sa==null || sa.length<8)
{
System.err.println("DH [165]: "+sa[0].strip()+" -- Array == null ODER länge <8 -- continued;");
continue;
}
try{
pl.add(new Pflanze(sa[0].strip(),
sa[1],
sa[2],
sa[3],
sa[4],
sa[5].split("-"),
sa[6].split("-"),
sa[7].split("-")));
}catch( ArrayIndexOutOfBoundsException iob)
{System.err.println("DH[179]: Pflanze: "+sa[0].strip()+" - "+iob.getLocalizedMessage()); }
catch( NumberFormatException nfe)
{System.err.println("DH[181]: Pflanze: "+sa[0].strip()+" - "+nfe.getLocalizedMessage());}
};
return pl;
} catch (FileNotFoundException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
}
return null;
}
/**
* nutzt speichernBeet(Beet) in Schleife
*/
public void speichereBeete(ArrayList<Beet> beetListe)
{
for(Beet b : beetListe)
{
System.out.println("DH [189] speichere Beet: "+b);
speichereBeet(b);
}
}
public boolean speichereBeet(Beet b)
{
/* File : beetname.beet
*
* breitexlänge#feste,ph,Licht,Düngung
*
* int festigkeit;
* int ph;
* Anspruch licht;
* Anspruch düngung;
*/
File f = new File(pfad.getAbsolutePath()+"/beete/");
try {
out = new BufferedWriter(new FileWriter(f+"/"+b.getName()));
out.write(b.speicherDaten());
out.newLine();
if(b.getPflanzen().isEmpty()) return true;
else
{
for(Pflanze pfl : b.getPflanzen())
{
System.out.println("DH[239] Writer out = "+pfl.speicherDaten());
out.write(pfl.speicherDaten());
out.newLine();
}
out.flush();
}
out.close();
} catch (IOException e) {
JOptionPane.showMessageDialog(null, e.getMessage(),
"Fehler beim Speichern: "+b, JOptionPane.ERROR_MESSAGE);
return false; }
// bis ende durchgelaufen :
return true;
}
Das Interface wird von jeder Klasse implementiert, die geladen oder gespeichert werden muss
Java:
public interface Daten
{
boolean laden() throws IOException;
boolean speichern();
String speicherDaten();
abstract String getPfad();
void setPfad(String s);
String getName();
JMenuItem laden = new JMenuItem("laden"),
speichern = new JMenuItem("speichern");
}
Mir ist, als würde ich zwei Objekte erzeugen, das eine bearbeiten und zum speichern ein anderes der selben Klasse aufrufen. Ich kann aber seit Tagen keine doppelte Zuweisung o.ä. finden.
über Hilfe wäre ich sehr dankbar, ich hoffe das der Code reicht
MfG