Serialisierung: speichern und auslesen, auslesen klappt nicht

kuzdu

Aktives Mitglied
Hallo!

Ich habe gerade in meinem Java-Buch Serialisierung durchgenommen und wollte mal ein Adressbuch schreiben. Deshalb mein Prinzip: Per Switch-case kann man zwischen drei Optionen wählen.
1) Einfügen
2) Lesen
3) Beenden

Das Serialisieren klappt auch soweit, doch nun möchte ich meine gespeicherten Daten auslesen und dabei haperts noch.

Vorweg: Bin noch Anfänger, also sorry, wenn mein Code vllt etwas kompliziert geschrieben ist.

Java:
//Main-Klasse
package adressebuch;

import java.io.*;


class Ausgabeasd implements Serializable {
    String vorname;
    
    public Ausgabeasd(String v) {
        vorname = v;
    }
       
    public String getVorname() {
        return vorname;
        }
}


//Input/Output zur Auswahl der Adressbuchoption
class Lesen {
    
    public int lesen() throws IOException {
        
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();  
    int zahl = Integer.parseInt(s);
    return zahl;
    
    }
}

    

class Auswahl extends Eingabe {
//Aufruf Klasse speichern
    Speichern s = new Speichern();
    
    
    
                
    public void auswaehlen(int zahl) throws IOException {
    
        int zahlZwei;
        zahlZwei = zahl;
        switch(zahlZwei)
    {
            case 1: 
                System.out.println("Eintragen");  //Objekt serialisieren
                Ausgabeasd ag = new Ausgabeasd(s.speichern());
                
                System.out.println("Erfolgreich eingetragen, geben Sie nun wieder eine Zahl an:");
                break;

                
            case 2:
                System.out.println("Auslesen");
                ag = null;  //Steht so in meinem Buch
                try {
                    ObjectInputStream is = new ObjectInputStream(new FileInputStream("foo.ser"));
                    Ausgabeasd wiederhergestellt = (Ausgabeasd) is.readObject();

                System.out.println("asd" + wiederhergestellt.getVorname());
                }
                catch(Exception ex) {
                    ex.printStackTrace();
                }
                //Hier kommt Exceptionfehler, schildere ich weiter unten welcher
                break;  
            case 3:
                System.exit(0); break; 
            default:
                System.out.println("Wrong");
    }
    }
}

public class Adressebuch {

    public static void main(String[] args) throws IOException {
   
    
    int beenden = 0;

    Lesen l = new Lesen();
    Auswahl a = new Auswahl();    
    
    do{
    a.auswaehlen(l.lesen());
    }
    while(beenden == 0);
    
    }
}

Hier noch die Klasse speichern

Java:
package adressebuch;

import java.io.*;

//Klasse Eingabe zeige ich gleich auch noch
public class Speichern extends Eingabe implements Serializable  {

    Eingabe e = new Eingabe();
    String erfolg = "Erfolgreich eingetragen";
    
    public String speichern() throws IOException {
    
     //in Datei foo schreiben
    try {        
        FileOutputStream fs = new FileOutputStream("foo.ser");
        ObjectOutputStream os = new ObjectOutputStream(fs);
        
        //Hier wird der Vorname aus der Klasse Eingabe geholt
        os.writeObject(e.vorname());
        os.close();
        
    }
    catch (Exception ex) {
        ex.printStackTrace();
    }
   return erfolg;
    
    }
}

Nun die Klasse Eingabe

Java:
package adressebuch;

import java.io.*;

public class Eingabe {

    String vorname;
        
    
    public String vorname() throws IOException {
        
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    vorname = s;
    
    
    return vorname;
    }
    
    public String getVorname(){
        return vorname;
    }
}

Nun zu dem Fehler: Das Eintragen funktioniert soweit, also es wurde beim ersten Mal auf jeden Fall eine foo.ser angelegt.
Wenn ich den Inhalt allerdings auslesen möchte und die Zwei drücke, dann kommt folgender Exceptionfehler:

java.lang.ClassCastException: java.lang.String cannot be cast to adressebuch.Ausgabeasd
at adressebuch.Auswahl.auswaehlen(Adressebuch.java:63)
at adressebuch.Adressebuch.main(Adressebuch.java:95)

Also ich verstehe das so, dass der String nicht in Ausgabeasd übertragen werden kann, nur hilft mir das irgendwie nicht mehr weiter. Programmiere jetzt auch schon gut eine Stunde daran und sehe vielleicht den Wald vor lauter Bäumen nicht mehr :bahnhof:. Deshalb wäre ich für einen Rat sehr dankbar. 🙂

Eine andere Sache ist: gehe ich das Adressbuch "richtig" an oder ist meine Art sehr kompliziert?
Und falls mein Adressbuch irgendwann funktionieren sollte, gibt es eine Möglichkeit spezielle Einträge wieder zu löschen? Wonach müsste man googeln, hatte mal gesucht, aber nichts gefunden.

Danke für eure Hilfe

Gruß
 
a) du serialisierst nur einen String ( os.writeObject(e.vorname()); ) vorname = String
b) probierst beim Lesen aber zu Ausgabeasd zu casten
c) wildes Durcheinander.
 
du serialisierst nicht das Object vom Typ Ausgabeasd sondern nur das Attribut vorname vom Typ String. deshalb dann die ClassCastException, weil ein String kein Ausgabeasd ist

edit: zu langsam aber c) von eRaaaa kann ich ebenfalls bestätigen 😀
 
Habe mir Rat c) zum Gemüte geführt und es "neu" geschrieben. Tatsächlich es funktioniert nun.

Ich stoße jetzt allerdings an ein neues Problem. Der Code funktioniert soweit, aber ich gebe meinetwegen zwei Vornamen an, diese werden auch wunderbar gespeichert. Starte ich das Programm neu, sind diese immer noch da. Füge ich dann wieder zwei neue Vornamen hinzu, sind die alten überschrieben. Aber das ist ja nicht Sinn eines Adressbuches haha 🙂 Hat jmd. diesbezüglich eine Idee? Also wie ich diese Überschreibung verhindern kann. Morgen frage ich mal google, aber wenn jmd. schon vorher Lust hat etwas zu posten bzw. mir ein Stichpunkt geben kann, bin ich natürlich dankbar.

Eine letzte Frage noch: Gibt es eine Möglichkeit, wenn ich 5 Adressen drin habe nur eine ganz bestimmte zu löschen? Wie gehe ich da vor?

Ansonsten gute Nacht und hier mein gesamter, vollständiger und hoffentlich übersichtlicherer Code 🙂

Java:
//main-Klasse
package adressbuch2;
import java.io.*;

class OptionAuswahl {
    
    public int optionAuswahl() throws IOException {
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    int auswahlNummer = Integer.parseInt(s);
    return auswahlNummer;
    }
    
}

public class Adressbuch2 {

    public static void main(String[] args) throws IOException {
    
    OptionAuswahl oa = new OptionAuswahl();
    Speichern sp = new Speichern();
    Auslesen al = new Auslesen();   
    int ende = 0;  
    
    
    System.out.println("1 = Speichern");
    System.out.println("2 = Ansehen");
    System.out.println("3 = Exit");
    
    do{
        switch(oa.optionAuswahl()) {
            case 1: System.out.println("Einlesen"); 
            sp.speichern(); 
            break;
            
            case 2: System.out.println("Auslesen"); 
            al.auslesen();
            break;
                
            case 3: System.out.println("Auf Wiedersehen!");
            System.exit(0);
            break;
            
            default: System.out.println("Falsche Eingabe");
        }
        
        
    }    
    while(ende == 0);    
    }
}

Java:
//eingabe
package adressbuch2;
import java.io.*;

class Eingabe {
    String vorname;
        
    public String vorname() throws IOException {
    BufferedReader in = new BufferedReader(
    new InputStreamReader( System.in ) );
    String s = in.readLine();
    vorname = s;
    return vorname;
    }
}

Java:
package adressbuch2;
import java.io.*;

class Personalien implements Serializable {
    
    String vorname;
    
    public Personalien(String v){
        vorname = v;
    }
    
    public String getVorname(){
        return vorname;
    }
}

Java:
package adressbuch2;
import java.io.*;


class Speichern extends Eingabe {

    
    public void speichern() throws IOException {
    
    Eingabe e = new Eingabe();
    Personalien p = new Personalien(e.vorname());    
    Personalien pZwei = new Personalien(e.vorname());
    try {
        ObjectOutputStream os = new ObjectOutputStream(new FileOutputStream("buch.ser"));
        os.writeObject(p);
        os.writeObject(pZwei);
        
    }
    catch(IOException ex) {
        ex.printStackTrace();
    }
    
    p = null;    
    }
    
}

Java:
package adressbuch2;

import java.io.*;

class Auslesen {
    
    
    public void auslesen() {
    try {
        ObjectInputStream is = new ObjectInputStream(new FileInputStream("buch.ser"));
        Personalien wiederhergestellt = (Personalien) is.readObject();
        Personalien wiederhergestelltZwei = (Personalien) is.readObject();
        
        
        
        System.out.println("Vorname: " + wiederhergestellt.getVorname());
        System.out.println("Vorname: " + wiederhergestelltZwei.getVorname());
    }
    catch(Exception ex) {
        ex.printStackTrace();
    }
    
    }
}
 
Zuletzt bearbeitet:
ich würde dir eine Datenhaltung direkt im Speicher empfehlen (z.B. eine Liste). Diese kannst du dann am Ende komplett serialisieren und somit auch einfacher Adressen löschen.
 
Habe mir Rat c) zum Gemüte geführt und es "neu" geschrieben. Tatsächlich es funktioniert nun.

Ich stoße jetzt allerdings an ein neues Problem. Der Code funktioniert soweit, aber ich gebe meinetwegen zwei Vornamen an, diese werden auch wunderbar gespeichert. Starte ich das Programm neu, sind diese immer noch da. Füge ich dann wieder zwei neue Vornamen hinzu, sind die alten überschrieben. Aber das ist ja nicht Sinn eines Adressbuches haha 🙂 Hat jmd. diesbezüglich eine Idee? Also wie ich diese Überschreibung verhindern kann. Morgen frage ich mal google, aber wenn jmd. schon vorher Lust hat etwas zu posten bzw. mir ein Stichpunkt geben kann, bin ich natürlich dankbar.

Ansonsten gute Nacht und hier mein gesamter, vollständiger und hoffentlich übersichtlicherer Code 🙂
 
Zuletzt bearbeitet:
hast du meinen post oben auch gelesen? 🙂

du sollst eine Klasse schreiben, die eine ArrayList o.ä. mit Personalien hält. Diese serialisierst du dann komplett. Damit hast du das Problem auch nicht mehr.
 
hast du meinen post oben auch gelesen? 🙂
Iwie drüber gelesen, sorry 🙂

Habe mich jetzt soweit mit ArrayList auseinandergesetzt und bin leider an einige, verschiedene Schwierigkeiten gekommen, die wohl alle miteinander zusammenhängen. 🙂

Ich habe das ganze jetzt in eine grafische Oberfläche verpackt. Eine Textarea, dort erscheinen die Adressen, ein Textfeld zur Eingabe und drei Buttons: Eintragen, Auslesen, Löschen.

(1) Wenn ich eintragen möchte, rufe ich die Klasse SpeicherListener auf:

Java:
class SpeicherListener implements ActionListener {
    
    public void actionPerformed(ActionEvent a) {
  
   Adresse a1 = new Adresse(textfeld.getText());
    Adresse a2 = new Adresse(textfeld.getText());
    Adresse a3 = new Adresse(textfeld.getText());
    
    
    
    if(i==1) { //i ist in meiner main class definiert mit int i = 1;
    AdressListe.add(a1);   
    text.setText("1. Adresse gespeichert");
    i++;
    }
    else if(i == 2) {
    AdressListe.add(a2);
    text.setText("2. Adresse gespeichert");
    i++;
    }
    else
    {
    AdressListe.add(a3);
    text.setText("3. Adresse gespeichert");
    }

}

}

Hier beginnt nun das erste Problem: Einmal finde ich meine Methode unheimlich statisch. Weil so können nur drei Adressen gespeichert werden. Gibt es die Möglichkeit mit der Arraylist etwas dynamisches zu erstellen? (Ich habe leider nichts gefunden)

Zur Verdeutlichung was ich meine, hier ein Pseudocode:
Schaue ob Stelle 1 in der ArrayList besetzt ist,
wenn ja, schaue eine Stelle höher und kontrolliere ob Stelle2 besetzt ist,
wenn ja, schaue eine Stelle höher....
Wenn nein, lege neue Stelle an.

Also in der Art so etwas:
Java:
int i = 0;
int ende = 0;
do
{
if(AdressListe.contains(i) == true)
i++;
else
{
AdressListe.add(a[i]); //<------ Das habe ich ausprobiert, funktioniert aber nicht :/
ende = 1;
}
while(ende == 1)


(2) Nun meine 2. Schwierigkeit
Mein Löschen sieht so aus:

Java:
class LoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {
    
        if(textfeld.getText().equals("1"))
        {
        text.setText("Adresse 1 ist gelöscht");    
        AdressListe.remove(0);
        i--;
        }
        else if(textfeld.getText().equals("2"))
        {    
        text.setText("Adresse 2 ist gelöscht");    
        AdressListe.remove(1);
        i--;
        }
        else if(textfeld.getText().equals("3"))
        {   
        text.setText("Adresse 3 ist gelöscht");    
        AdressListe.remove(2);
        i--;
        }
    }
Diese Lösung funktioniert zwar zum Teil, finde ich aber ebenfalls sehr unschön. Vorallem aus dem Grund weil es zu einem Fehler kommt, wenn ich den Befehl zum Löschen der Adresse 3 gebe und keine Adresse 3 existiert.

Meine Alternative wäre wieder zu schauen, ob die angewählte Adresse, überhaupt einen Inhalt hat: Also if(AdressListe.contains(textfeld.getText()) == true)
dann löschen.

Das Problem, welches hier auftritt: Die AdressListe.contains(0) ist immer false, auch wenn eindeutig Inhalt in der Liste ist. Habe gegoogelt und habe sogar hier im Forum ein ähnliches Problem gefunden, wo das Adresse a1 = new Adresse(textfeld.getText()); immer neu erstellt wird und deshalb immer leer ist.
Ich vermute, dass die Klasse LoeschenListener nicht auf die "richtige"(?) Arraylist zugreift und deshalb auch keinen Wert findet.
Deshalb habe ich die Arraylist mal in meiner main class erstellt:

Java:
public class AdressbuchGui {
   
    JTextArea text;
    JTextField textfeld;
    JButton eintragen;
    JButton auslesen;
    JButton loeschen;
    ArrayList<Adresse> AdressListe = new ArrayList<Adresse>();
    Adresse a1 = new Adresse("asd");
//    Adresse a1 = new Adresse(textfeld.getText()); <--- NullPointerException

Hier stoße ich nun allerdings an ein weiteres Problem: Einmal ist die Adresse a1 in dem LoeschenListener immer noch false und das zweite ist, dass ich nun eine NullPointerException bekomme, da anscheinend das Textfeld aufgerufen wird, bevor es einen Wert hat.

Ich habe nun rumprobiert, doch komme auf keinen grünen Zweig. Wo genau muss ich die ArrayList erstellen, dass alle Klassen gut darauf zugreifen und wie unterbinde ich die NullPointerException? Gibt es eine Möglichkeit die Adresse dynamisch zu erstellen?

Ich hoffe meine Problem sind einigermaßen verständlich, wenn ihr noch mehr Code braucht oder spezifirische Auskünfte benötigt, gebe ich gerne 🙂

Danke für Hilfe


PS: Ich weiß, dass das zurzeit gar nichts mehr mit serialisieren zu tun hat, aber ich wollte nicht extra einen neuen Thread erstellen 😉
 
> und wie unterbinde ich die NullPointerException?
versuche doch, nur sinnvolle Fragen zu stellen, es geht doch nicht ums Unterbinden, sondern
> Adresse a1 = new Adresse(textfeld.getText());
ist an der Stelle sowieso falsch, selbst ohne Exception unnötig, was hast du dort vor? ein Text wird dort noch nicht drinstehen

------

arbeite mit der size() der Liste statt mit Index,
bzw. beim add() kannst du einfach das neue Objekt anfügen, musst überhaupt nichts nachschauen, jedenfalls nichts mit i,

bei remove() kannst du ja evtl. den letzten Index in der Liste aus size() berechnen

------

contains auf eine Liste mit Adress-Objekten funktioniert logischerweise nur mit auch einem Adress-Objekt, weder mit '0' was immer das sein soll,
noch mit einem String,
damit Adress gefunden wird, muss allerdings die equals-Methode implementiert sein
(wahrscheinlich kommt gleich die Frage 'ich weiß nix, alles noch viel haarkleiner erklären', ich belasse es aber erstmal dabei,
und hoffe mit diesem Hinweis irgendeine Art von Denktätigkeit im Gehirn anzustoßen, es gibt Lehrbücher, Internet-Tutorials usw...)

Galileo Computing :: Java ist auch eine Insel - 8 Besondere Klassen der Java SE
8.3.3 Objektgleichheit mit equals() und Identität

Galileo Computing :: Java ist auch eine Insel - 13 Einführung in Datenstrukturen und Algorithmen
13.4.3 Über die Bedeutung von equals() und hashCode()


(edit: wenn HashSet, dann nicht nur equals(), sondern eben auch hashCode() wichtig)
 
Zuletzt bearbeitet von einem Moderator:
Du willst doppelte Werte vermeiden, ist das richtig? Sollte dem so sein, warum nimmst du nicht einfach eine HashSet, welches keine doppelten Einträge zulässt.
 
> und wie unterbinde ich die NullPointerException?
versuche doch, nur sinnvolle Fragen zu stellen, es geht doch nicht ums Unterbinden, sondern
> Adresse a1 = new Adresse(textfeld.getText());
ist an der Stelle sowieso falsch, selbst ohne Exception unnötig, was hast du dort vor? ein Text wird dort noch nicht drinstehen

Also das wäre ja meine Frage gewesen, wo die Adresse a1 usw.. richtig wäre. Weil es ergibt sich folgendes Problem bei mir:

Die Klasse Adresse fordert einen String
Java:
class Adresse {
    
    String vorname;
    
    Adresse(String vorname) {
        this.vorname = vorname;
    }
}

Also fordert der Compiler hier in den Klammern einen Wert: Adresse a1 = new Adresse("hier der Wert");
Da ich diesen Wert ja eign. für mein Adressbuch bestimmen will, habe ich das textfeld.getText() eingefügt. Dieses führt allerdings in der main class zu einer Exception.

Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse, dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

arbeite mit der size() der Liste statt mit Index,
bzw. beim add() kannst du einfach das neue Objekt anfügen, musst überhaupt nichts nachschauen, jedenfalls nichts mit i,

Wenn ich das i weggelasse, überschreibt der in meinem immer den ersten Wert. Deshalb das i. Aber size ist eine gute Idee, werde ich mal ausprobieren. Danke.


bei remove() kannst du ja evtl. den letzten Index in der Liste aus size() berechnen


contains auf eine Liste mit Adress-Objekten funktioniert logischerweise nur mit auch einem Adress-Objekt, weder mit '0' was immer das sein soll,
noch mit einem String,
damit Adress gefunden wird, muss allerdings die equals-Methode implementiert sein

Das 0 sollte sich eing. auf den ersten Wert im Array beziehen. Habe es mit remove(a1) ausprobiert und es funktioniert. Allerdings nur wenn Adresse a1 = new... in der main class definiert ist.

Die equals Methode ist doch implementiert oder meinst du etwas anderes?
Ich gebe eine "1" ins textfeld und der Vergleich wird mit textfeld.getText().equals("1") gemacht. Das einzige Blöde daran war, dass wenn kein Wert drin stand und ich eine 1 eingeben habe. Hat der remove(0) gemacht, was zu einem Fehler geführt hat. Das wurde aber durch remove(a1) behoben. Habe es gerade ausprobiert.


(wahrscheinlich kommt gleich die Frage 'ich weiß nix, alles noch viel haarkleiner erklären', ich belasse es aber erstmal dabei,
und hoffe mit diesem Hinweis irgendeine Art von Denktätigkeit im Gehirn anzustoßen, es gibt Lehrbücher, Internet-Tutorials usw...)

Ich hoffe doch nicht, dass das so rüberkommt! Will es ja lernen und muss es auch nicht für iwas machen, nur so, weil ich es kann (bzw. noch nicht kann) 🙂

Galileo Computing :: Java ist auch eine Insel - 8 Besondere Klassen der Java SE
8.3.3 Objektgleichheit mit equals() und Identität

Galileo Computing :: Java ist auch eine Insel - 13 Einführung in Datenstrukturen und Algorithmen
13.4.3 Über die Bedeutung von equals() und hashCode()


(edit: wenn HashSet, dann nicht nur equals(), sondern eben auch hashCode() wichtig)
Das werde ich mir mal anschauen.
Von HashSet habe ich nun wiederrum noch gar nichts gehört, deshalb muss ich mich da erst reinlesen.
Vielen Dank für die Hilfe schon einmal


Du willst doppelte Werte vermeiden, ist das richtig? Sollte dem so sein, warum nimmst du nicht einfach eine HashSet, welches keine doppelten Einträge zulässt.

Nein, doppelte Einträge will ich (noch) nicht verhindern.
Also das Hauptproblem ist, dass ich nicht genau weiß, wo ich Adresse a1 = new Adress usw... anlegen muss, damit ich meine Werte aus dem Textfeld eingeben kann und meine beiden Listener Speicher und Loeschen drauf zugreifen können.
 
Zuletzt bearbeitet:
> Also fordert der Compiler hier in den Klammern einen Wert: Adresse a1 = new Adresse("hier der Wert");

dieser Wert muss aber im Fall der Fälle doch nicht aus einem Textfeld kommen, gibt auch "" als Dummy-Leerstring



wenn du einen Listener hast der eine Aktion ausführt, dann sollten im Zweifel auch genau dort die Befehle hin,
was spricht dagegen? hast du vielleicht schon geschrieben, geht in der Masse dann etwas unter

edit:
> Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse,
> dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

in jedem Listener diese Zeile neu schreiben, das ist im Moment vertretbarer Aufwand

--------

> Die equals Methode ist doch implementiert oder meinst du etwas anderes?
> Ich gebe eine "1" ins textfeld und der Vergleich wird mit textfeld.getText().equals("1") gemacht.

dass diese drei Adresse-Objekte mit 3x if fragwürdig sind hast du ja schon selber erkannt, der Code kann weg,

es geht um das equals in einer Klasse, eine Methode, alles nachzulesen,
damit contains() funktioniert

ein Testprogramm a la
Java:
public class Test
{
    public static void main(String[] args)
    {
        Adresse a1 = new Adresse("xy");
        Adresse a2 = new Adresse("xy");
        list.add(a1);
        System.out.println(list.contains(a2));
    }
}
mit restlichen Ergänzungen muss laufen, vorher wirds schwer in der Liste Adressen zu suchen,
falls das weiterhin ein benötigter Punkt ist
 
Zuletzt bearbeitet von einem Moderator:
Danke, bin jetzt schon ein Stück weitergekommen, doch eine Sache ist sehr seltsam.

Das AdressListe.remove(a1) funktioniert nur, wenn wirklich nur ein Element in der Liste eingetragen ist. Trage ich zwei Elemente in die Liste ein, funktioniert AdressListe.remove(a1) nicht mehr. Allerdings lässt sich dann das 2. Element löschen, mit AdressListe.remove(a2).

Es lässt sich also immer nur das letzte Element löschen.

Mein Code sieht inzwischen so aus:
Java:
public class AdressbuchGui {
    Adresse a1 = new Adresse("");
    Adresse a2 = new Adresse("");
....

class SpeichernListener implements ActionListener {
    
    public void actionPerformed(ActionEvent a) {
  
    a1 = new Adresse(textfeld.getText());
    a2 = new Adresse(textfeld.getText());
 
    if(AdressListe.size() == 0) {
    AdressListe.add(a1);   
    }
    else if(AdressListe.size() == 1) {
    AdressListe.add(a2);    
     }
  }
}

class LoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {
     
        AdressListe.remove(a1);
       
        }
    }
}




Edit:
@SlaterB
wenn du einen Listener hast der eine Aktion ausführt, dann sollten im Zweifel auch genau dort die Befehle hin,
was spricht dagegen? hast du vielleicht schon geschrieben, geht in der Masse dann etwas unter

edit:
> Wenn ich die Adresse a1 = new Adresse(textfeld.getText()); in meiner Klasse SpeicherListener lasse,
> dann kann ich mit der Klasse LoeschenListener nicht auf a1 zugreifen. Da liegt also mein Problem.

in jedem Listener diese Zeile neu schreiben, das ist im Moment vertretbarer Aufwand

Also wenn ich im in den beiden Listenern die Elemente neu deklariere, dann kriege ich sie nicht gelöscht, weil in meinem Code (wie ich vermute) die Verknüpfung zum Anderen fehlt.
Deshalb deklariere ich sie in der main classe.

Java:
class MeinLoeschenListener implements ActionListener {
    public void actionPerformed(ActionEvent a) {

 a1 = new Adresse(textfeld.getText());
    AdressListe.remove(a1);
}

}

Oder welche Zeile meinst du?
 
Zuletzt bearbeitet:
> dann kriege ich sie nicht gelöscht, weil in meinem Code (wie ich vermute) die Verknüpfung zum Anderen fehlt.

mit richtigen equals() brauchst du keine Verknüpfung, solange das fehlt kann in der Tat nicht viel funktionieren,
- siehe meine Links
- siehe vor allem mein Beispielprogramm im letzten Post..
 
Hier mal meine "version" zum ein und auslesen eines oder mehrerer objekte. gespeichert wird in einer xml datei. (anstatt der normalen speicherung (als .ser)). (ist auch in java ist auch eine insel). finde ich am einfachsten.

hier muss man garnicht viel "verstehen", nur wissen an welcher stelle man das/die Objekt/Objekte "einfügt".

Einfach diese beiden methoden in der gewünschten klasse einfügen.

in Zeile 12 das Objekt was man speichern will einfügen.
in zeile 41 sieht man wie das objekt wieder eingelesen wird + man muss darauf achten, weil es sich beim einlesen(in diesem fall) um den Typ "Object" handelt dass man auch noch eine typenumwandlung macht (in meinem fall war das eine mehrfach geschachtelte arraylist). stattdessen kann da aber auch (String) stehten falls es sich bei dem objekt um einen String handelt.


Java:
public void writeSiftDB(){
        
      
        
        
        XMLEncoder enc = null;
         
          try 
    { 
      enc = new XMLEncoder( new FileOutputStream(filename) ); 
      System.out.println("wird nun gespeichert!");
      enc.writeObject( ImageList ); 
      System.out.println("fertig mit speichern!");
    } 
    catch ( IOException e ) { 
      System.out.println("nicht gespeichert!");
        e.printStackTrace(); 
      
    } 
    finally { 
      if ( enc != null ) {
        enc.close();
        System.out.println("gespeichert!");
      }
       
    } 
        
    }
    
    public void loadSiftDB(){
        
        
        // Deserialize() 
 
    XMLDecoder dec = null; 
 
    try 
    { 
      dec = new XMLDecoder( new FileInputStream(filename) ); 
 
      ImageList = (ArrayList <ArrayList <ArrayList <Object>>>) dec.readObject(); 
     
 
      System.out.println( "Object geladen!"); 
 
      
    } 
    catch ( IOException e ) { 
        System.out.println("Fehler beim laden des objects!");
      e.printStackTrace(); 
    } 
    finally { 
      if ( dec != null ) 
        dec.close(); 
    } 
  }
 

Zurück
Oben