Input/Output Bekanntenkreis Gui - Speichern und Laden der Bekannten

Tachika

Mitglied
Hallo :),
nach langer Überlegung, habe ich mich doch entschieden hier einen Eintrag zu verfassen, da ich an dieser Stelle einfach null weiter komme. Ich bin Java Anfänger und habe leider schon in vielen Foren mitbekommen, dass Anfänger runter gemacht wurden, wenn sie Fragen gestellt haben, weil ihr Code an anderen Stellen Fehlerhaft war. Ich bitte euch also etwas nachsichtig zu sein, ihr könnt mich gerne auf Fehler hinweisen aber ich Frage hier ja nicht umsonst. Ich bin weit von einem Profi entfernt und es kann durchaus sein, das mein folgender Code etwas chaotisch ist :).

So nun aber erst mal zu meiner Frage. Wir hatten in unserem Java Kurs die Aufgabe eine Art Adressbuch zu erstellen, Diese sollten wir dann in eine GUI um schreiben und nun geht es darum, diese Gui so zu erweitern, dass man die Bekannten Speichern und wieder Laden kann.

Hier erst mal der Komplette Code + mein Versuch des Speicherns /Ladens

Klasse Bekannter

Java:
public class Bekannter {    private String name;
    private String adresse;
    private String telefonnummer;
    private String handynummer;
    private String emailadresse;
    private String notizen;
    private String geburtstag;
    private String  verwandtschaftsart;
    private String  Art;
    
    


    private boolean isFreund;


    public String getGeburtstag() {
        return geburtstag;
    }


    public void setGeburtstag(String geburtstag) {
        this.geburtstag = geburtstag;
    }


    public boolean isFreund() {
        return isFreund;
    }


    public void setFreund(boolean isFreund) {
        this.isFreund = isFreund;
    }
    
    private boolean isVerwandt;
    
    public String getVerwandtschaftsart() {
        return verwandtschaftsart;
    }


    public void setVerwandtschaftsart(String verwandtschaftsart) {
        this.verwandtschaftsart = verwandtschaftsart;
    }
    
    public boolean isVerwandt() {
        return isVerwandt;
    }
    
    public void setVerwandt(boolean isVerwandt) {
        this.isVerwandt = isVerwandt;
    }


    public String getName() {
        return name;
    }


    public Bekannter(String name, String adresse, String telefonnummer,
            String handynummer, String emailadresse, String notizen,
            boolean isFreund, boolean isVerwandt) {
        super();
        this.name = name;
        this.adresse = adresse;
        this.telefonnummer = telefonnummer;
        this.handynummer = handynummer;
        this.emailadresse = emailadresse;
        this.notizen = notizen;
        this.isFreund = isFreund;
        this.isVerwandt = isVerwandt;
    }
    
    public Bekannter() {
        
    }


    public void setName(String name) {
        this.name = name;
    }


    public String getAdresse() {
        return adresse;
    }


    public void setAdresse(String adresse) {
        this.adresse = adresse;
    }


    public String getTelefonnummer() {


        return telefonnummer;
    }


    public void setTelefonnummer(String telefonnummer) {
        this.telefonnummer = telefonnummer;
    }


    public String getHandynummer() {
        return handynummer;
    }


    public void setHandynummer(String handynummer) {
        this.handynummer = handynummer;
    }


    public String getEmailadresse() {
        return emailadresse;
    }


    public void setEmailadresse(String emailadresse) {
        this.emailadresse = emailadresse;
    }


    public String getNotizen() {
        return notizen;
    }


    public void setNotizen(String notizen) {
        this.notizen = notizen;
    }
    


    public String getArt() {
        return Art;
    }


    public void setArt(String art) {
        this.Art = art;
    }


    public String toString() {
        String typ;
        if (isFreund) {
            typ = "Freund";
            this.Art = "Freund";
        }else if (isVerwandt) {
            typ = "Verwandter";
            this.Art = "Verwandter";
        } else {
            typ = "Bekannter";
            this.Art = "Bekannter";
        }
        String ausgabe = "Typ:" + typ + "\n";
        ausgabe += "Name: " + name + "\n";
        ausgabe += "Adresse: " + adresse + "\n";
        ausgabe += "Telefonnummer: " + telefonnummer + "\n";
        ausgabe += "Handynummer: " + handynummer + "\n";
        ausgabe += "E-Mail: : " + emailadresse + "\n";
        ausgabe += "Notizen: " + notizen + "\n";
        if (isFreund) {
            ausgabe += "Geburtstag: " + geburtstag;
        }
        if (isVerwandt) {
            ausgabe += "Verwandtschaftsart: " + verwandtschaftsart;
        }
        return ausgabe;
    }
    
    
}

Klasse Dialog

Java:
import java.awt.Container;import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;


import javax.swing.JButton;
import javax.swing.JComboBox;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JTextArea;
import javax.swing.JTextField;




class Dialog extends JDialog implements KeyListener{
    private JTextField txtName = new JTextField(10);
    private JTextField txtTelefonnummer = new JTextField(10);
    private JTextField txtHandynummer = new JTextField(10);
    private JTextField txtEmailadresse = new JTextField(10);
    private JTextField txtGeburtstag = new JTextField(10);
    private JTextField txtVerwandtschaftsart = new JTextField(10);
    private JTextArea txtAdresse = new JTextArea("", 5, 10);
    private JTextArea txtNotizen  = new JTextArea("", 5, 10);
    private JButton ok = new JButton("Hinzufügen");
    StringManagerGui ref;


    Dialog(final StringManagerGui ref) {
        super(ref, "Neuen Bekannten", true); // Modal oder Nicht-Modal
        this.ref = ref;
        setLayout(null);
        Container cp = getContentPane();
        JLabel lblName = new JLabel("Name");
        JLabel lblAdresse = new JLabel("Adresse");
        JLabel lblTelefonnummer = new JLabel("Telefonnummer");
        JLabel lblHandynummer = new JLabel("Handynummer");
        JLabel lblEmailadresse = new JLabel("E-Mail");
        JLabel lblNotizen = new JLabel("Notizen");
        JLabel lblGeburtstag = new JLabel("Geburtstag");
        JLabel lblVerwandtschaftsart = new JLabel("Verwandtschaftsart");
        cp.add(lblName);
        lblName.setBounds(10, 10, 300, 30);
        cp.add(lblAdresse);
        lblAdresse.setBounds(10, 40, 300, 30);
        cp.add(lblTelefonnummer);
        lblTelefonnummer.setBounds(10, 110, 300, 30);
        cp.add(lblHandynummer);
        lblHandynummer.setBounds(10, 140, 300, 30);
        cp.add(lblEmailadresse);
        lblEmailadresse.setBounds(10, 170, 300, 30);
        cp.add(lblNotizen);
        lblNotizen.setBounds(10, 200, 300, 30);
        cp.add(lblGeburtstag);
        lblGeburtstag.setBounds(10, 270, 300, 30);
        cp.add(lblVerwandtschaftsart);
        lblVerwandtschaftsart.setBounds(10, 300, 300, 30);
        cp.add(txtName);
        txtName.setBounds(140, 10, 300, 30);
        txtName.addKeyListener(this);
        cp.add(txtAdresse);
        txtAdresse.setBounds(140, 40, 300, 70);
        cp.add(txtTelefonnummer);
        txtTelefonnummer.setBounds(140, 110, 300, 30);
        cp.add(txtHandynummer);
        txtHandynummer.setBounds(140, 140, 300, 30);
        cp.add(txtEmailadresse);
        txtEmailadresse.setBounds(140, 170, 300, 30);
        cp.add(txtNotizen);
        txtNotizen.setBounds(140, 200, 300, 70);
        cp.add(txtGeburtstag);
        txtGeburtstag.setBounds(140, 270, 300, 30);
        txtGeburtstag.setEnabled(false);
        cp.add(txtVerwandtschaftsart);
        txtVerwandtschaftsart.setBounds(140, 300, 300, 30);
        txtVerwandtschaftsart.setEnabled(false);
        String[] typen = { "Bekannter", "Freund", "Verwandter" };
        final JComboBox<String> cmbTyp = new JComboBox<String>(typen);
        cp.add(cmbTyp);
        cmbTyp.setBounds(140, 340, 130, 30);
        cmbTyp.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                if (cmbTyp.getSelectedItem().equals("Bekannter")) {
                    txtGeburtstag.setEnabled(false);
                    txtVerwandtschaftsart.setEnabled(false);
                } else if (cmbTyp.getSelectedItem().equals("Freund")){
                    txtGeburtstag.setEnabled(true);
                }else{
                    txtVerwandtschaftsart.setEnabled(true);
                    txtGeburtstag.setEnabled(false);
                }
            }
        });
        ok.setBounds(280, 340, 130, 30);
        ok.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                boolean isFreund;
                if (cmbTyp.getSelectedItem().equals("Freund")) {
                    isFreund = true;
                } else {
                    isFreund = false;
                }
                
                boolean isVerwandt;
                if (cmbTyp.getSelectedItem().equals("Verwandter")) {
                    isVerwandt = true;
                } else {
                    isVerwandt = false;
                }
                Bekannter b = new Bekannter(txtName.getText(), txtAdresse
                        .getText(), txtTelefonnummer.getText(), txtHandynummer
                        .getText(), txtEmailadresse.getText(), txtNotizen
                        .getText(), isFreund, isVerwandt);
                if (isFreund) {
                    b.setGeburtstag(txtGeburtstag.getText());
                } else if (isVerwandt) {
                    b.setVerwandtschaftsart(txtVerwandtschaftsart.getText());    
                }


                ref.newBekannten(b);
                setVisible(false);
            }
            
        });
        ok.setEnabled(txtName.getText().length()>0);
        cp.add(ok);
        setSize(500, 450);
        setLocation(250, 320);
    }
    
    public void keyPressed(KeyEvent e) {
        ok.setEnabled(txtName.getText().length()>0);
        
    }


    public void keyReleased(KeyEvent e) {
        ok.setEnabled(txtName.getText().length()>0);
        
    }
    public void keyTyped(KeyEvent e) {
        
    }


    
}

Klasse StringManagerGui

Java:
import java.awt.Container;import java.awt.FlowLayout;


import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JTextArea;


public class StringManagerGui extends JFrame{
    private JTextArea stringMonitor;
    private JButton next;
    private JButton previous;
    private JButton save;
    private JButton load;
    private JButton new_String;
    private StringManagerGui stm;
    private Bekanntenlist sl;
    private JFrame frame;
    
    public StringManagerGui() {
        sl = new Bekanntenlist();
        stm = this;
        Container contentPane = getContentPane();
        contentPane.setLayout(new FlowLayout());
        JPanel buttons = new JPanel(new FlowLayout());
        stringMonitor = new JTextArea("", 25, 40);
        stringMonitor.setEditable(false);
        contentPane.add(stringMonitor);
        
        frame = new JFrame("Testname");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        previous = new JButton("<<<");
        previous.addActionListener(new  java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                stringMonitor.setText(sl.previousBekannter().toString());
            }
        });
        new_String = new JButton("Hinzufügen");
        new_String.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                Dialog d = new Dialog(stm);
                d.setVisible(true);
            }
        });
        next = new JButton(">>>");
        next.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                stringMonitor.setText(sl.nextBekannter().toString());
            }
        });
        save = new JButton("Speichern");
        save.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                JFileChooser dateiWahl = new JFileChooser();
                dateiWahl.showSaveDialog(frame);
                sl.dateiSpeichern(dateiWahl.getSelectedFile());
            }
        });
        
        load = new JButton("Laden");
        load.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent e) {
                JFileChooser dateiOeffnen = new JFileChooser();
                dateiOeffnen.showOpenDialog(frame);
                sl.dateiLaden(dateiOeffnen.getSelectedFile());
            }
        });
        
        buttons.add(previous);
        buttons.add(new_String);
        buttons.add(next);
        buttons.add(save);
        buttons.add(load);
        contentPane.add(buttons);
        setSize(500, 500);
        setVisible(true);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }


    public void newBekannten(Bekannter bekannter) {
        stringMonitor.setText(bekannter.toString());
        sl.addBekannten(bekannter);
    }


    public static void main(String[] args) {
        StringManagerGui smg = new StringManagerGui();
    }




}

Klasse Bekanntenlist

In dieser Klasse befindet sich dann auch mein Versuch. Momentan wird jedoch nur der erste Bekannte den man gespeichert hat auch wieder aus der Textdatei ausgelesen. Es werden zwar alle in die Textdatei geschrieben, ich habe aber keine Ahnung, wie ich diese richtig auslese, damit man wieder im Adressbuch blättern kann und alle bekannten angezeigt bekommt. Hoffentlich kann mir jemand helfen :)
Java:
import java.io.*;import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;


public class Bekanntenlist implements Serializable {
    private List<Bekannter> list;
    private ListIterator<Bekannter> iterator;


    public Bekanntenlist() {
        list = new ArrayList<Bekannter>();
        iterator = list.listIterator();
    }


    public void addBekannten(Bekannter bekannter) {
        list.add(bekannter);
        iterator = list.listIterator();
    }


    // liefert das vorherige Element aus der Liste


    public Bekannter previousBekannter() {
        if (iterator.hasPrevious())
            return iterator.previous();
        return list.get(0);
    }


    // Liefert das nächste Element aus der Liste


    public Bekannter nextBekannter() {
        if (iterator.hasNext())
            return iterator.next();
        return list.get(0);
    }


    public boolean isEmpty() {
        if (list.isEmpty()) {
            return true;
        }
        return false;
    }


    // Datei Speichern


    public void dateiSpeichern(File datei) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(datei));
            for (Bekannter bekannter : list) {
                writer.write(bekannter.getArt() + "/");
                writer.write(bekannter.getName() + "/");
                writer.write(bekannter.getAdresse() + "/");
                writer.write(bekannter.getEmailadresse() + "/");
                writer.write(bekannter.getGeburtstag() + "/");
                writer.write(bekannter.getHandynummer() + "/");
                writer.write(bekannter.getNotizen() + "/");
                writer.write(bekannter.getTelefonnummer() + "/");
                writer.write(bekannter.getVerwandtschaftsart() + "/");
            }
            writer.close();
        } catch (IOException ex) {
            System.out.println("konnte die Bekanntenliste nicht schreiben");
            ex.printStackTrace();
        }
    }


    // datei Laden
    public void dateiLaden(File datei) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(datei));
            String zeile = null;
            while ((zeile = reader.readLine()) != null) {
                test(zeile);
                System.out.println(zeile);
            }
            reader.close();
        } catch (IOException ex) {
            System.out.println("konnte die Bekanntenliste nicht lesen");
            ex.printStackTrace();
        }
    }


    // testfunktion, die aus den gelesenen zeilen einen Neuen Bekannten erstellt
    private void test(String zuParsendeZeile) {
        String[] zeile = zuParsendeZeile.split("/");
        Bekannter bekannter = new Bekannter();
        bekannter.setArt(zeile[0]);
        bekannter.setName(zeile[1]);
        bekannter.setAdresse(zeile[2]);
        bekannter.setEmailadresse(zeile[3]);
        bekannter.setGeburtstag(zeile[4]);
        bekannter.setHandynummer(zeile[5]);
        bekannter.setNotizen(zeile[6]);
        bekannter.setTelefonnummer(zeile[7]);
        bekannter.setVerwandtschaftsart(zeile[8]);
        list.add(bekannter);
        iterator = list.listIterator();
    }
}
 

Saheeda

Top Contributor
Hallo Tachika,

willkommen im Forum ;-)


Um dir alle Bekannten ausgeben zu lassen, musst du nur über die Liste iterieren:

Java:
public void printAll() {
		while (this.iterator.hasNext()) {
			System.out.println(this.iterator.next());
		}
	}

Bist du sicher, dass nur der jeweils erste Eintrag geladen wird? Lass dir am Ende der dateiLaden-Methode mal die Größe der Liste ausgeben, bzw. über System.out.println(list) kriegst du auch alle Elemente angezeigt.
 

Tachika

Mitglied
Naja in der Konsole zeigt er mir alle an. Darum hatte ich ja auch die Testmethode System.out.println(zeile); drinne um das zu Überprüfen. Das Problem ist eher, dass dies auch in dem Dialogfenster meiner Gui paissieren soll. Da jedoch zeigt er immer nur den ersten bekannten an (ist ja auch logisch weil er im mom auch nur die 9 Zeilen für einen Bekannten wieder ausließt). Und ich weiß nun nicht wie ich das richtig anstelle dass man wie vorher in der Gui Blättern kann und er wirklich alle Zeilen einließt und auch Unterschiede macht, ab wann ein neuer Bekannter eingelesen wird (Ich hoffe mein problem ist verständlich ausgedrückt xD)... .

Edit: Mit der oben genannten Methode gibt er mir natürlich dann in der Konsole ebenfalls nur den ersten bekannten aus weil meine Methode zum auslesen so nicht stimmt :/
 
Zuletzt bearbeitet:

Saheeda

Top Contributor
Kannst du vielleicht mal ein Beispiel posten, wie so eine Datei bei dir aussieht?

Passiert irgendein Fehler? Fliegt irgendeine Exception? Wenn ja, poste bitte mal den kompletten Stacktrace (das, was beim Fehler in der Konsole ausgegeben wird).
 

Tachika

Mitglied
attachment.php

So also das ist das Grundlegende Programm. Über den Hinzufügen Button kann man Bekannte einfügen.
attachment.php
attachment.php

Ich Habe nun diese beiden Bekannten eingefügt und über die Buttons >>> und <<< kann man zwischen diesen Blättern
Wenn ich das ganze nun speichern möchte, speichert er diese Bekannten direkt hintereinander in eine Datei
Wenn ich diese Datei nun lade und auf >>> Drücke wird der erste Bekannte wieder angezeigt
attachment.php

Die Konsole zeigt jz durch System.out.println(zeile); was ich nun eingefügt hatte und die oben genannte Methode void printAll() nun folgendes an
attachment.php

Oben sieht man, wie das Ganze in der Datei steht (hatte das zuerst durch Leerzeichen getrennt aber irgendwie klappte das auslesen dann nicht also habe ich es in / geändert)
Da die beiden Bekannten in der Datei ja direkt nacheinander gespeichert werden, weiss ich nicht, wie ich das ganze schreiben muss, dass er wirklich alle bekannten aus der Datei ließt und auch erkennt wenn ein neuer bekannter beginnt. Vielleicht liegt ja der Fehler auch schon darin, dass ich es falsch speichere?

Ich hoffe mit den Bildern wird es jetzt klarer :)
 

Anhänge

  • 01.jpg
    01.jpg
    76,9 KB · Aufrufe: 47
  • 02.jpg
    02.jpg
    100,6 KB · Aufrufe: 54
  • 03.jpg
    03.jpg
    113,9 KB · Aufrufe: 48
  • 04.jpg
    04.jpg
    113 KB · Aufrufe: 49
  • 05.jpg
    05.jpg
    38,9 KB · Aufrufe: 76

Saheeda

Top Contributor
Hi,

ja, ich denke das Problem ist schon, wie du die Inhalte abspeicherst. Du schreibst einfach alles hintereinander weg. Selbst als Mensch ist es schwer, noch zu unterscheiden, wo der eine Kontakt aufhört und wo der andere anfängt.

Ich würde in der dateiSpeichern-Methode alle Infos jedes Bekannten zu einem einzigen String zusammenbasteln und diesen mit einem einzigen write abspeichern.
So wird jeder Kontakt in eine neue Zeile geschrieben. Damit sollte auch das Lesen klappen.

Und wenn dir das irgendwann zu unleserlich wird, kannst du dir mal z.B. Json anschauen, ein für Mensch und Maschine gut lesbares Dateiformat.
 

Tachika

Mitglied
Vielen Dank für den Tip :) habe das speichern als String umgeändert und nun klappt es tatsächlich! Muss zwar noch ein paar Kleinigkeiten ändern aber mein Hauptproblem ist gelöst! Danke!

Geänderte Bekanntenlist-Klasse:
Java:
import java.io.*;import java.util.ArrayList;
import java.util.List;
import java.util.ListIterator;


public class Bekanntenlist implements Serializable {
    private List<Bekannter> list;
    private ListIterator<Bekannter> iterator;


    public Bekanntenlist() {
        list = new ArrayList<Bekannter>();
        iterator = list.listIterator();
    }


    public void addBekannten(Bekannter bekannter) {
        list.add(bekannter);
        iterator = list.listIterator();
    }


    // liefert das vorherige Element aus der Liste


    public Bekannter previousBekannter() {
        if (iterator.hasPrevious())
            return iterator.previous();
        return list.get(0);
    }


    // Liefert das nächste Element aus der Liste


    public Bekannter nextBekannter() {
        if (iterator.hasNext())
            return iterator.next();
        return list.get(0);
    }


    public boolean isEmpty() {
        if (list.isEmpty()) {
            return true;
        }
        return false;
    }


    // Datei Speichern


    public void dateiSpeichern(File datei) {
        try {
            BufferedWriter writer = new BufferedWriter(new FileWriter(datei));
            for (Bekannter bekannter : list) {
                String bekanntendaten = bekannter.getArt() + "/"
                        + bekannter.getName() + "/" + bekannter.getAdresse()
                        + "/" + bekannter.getEmailadresse() + "/"
                        + bekannter.getGeburtstag() + "/"
                        + bekannter.getHandynummer() + "/"
                        + bekannter.getNotizen() + "/"
                        + bekannter.getTelefonnummer() + "/"
                        + bekannter.getVerwandtschaftsart() + "/";
                writer.write(bekanntendaten + "\n");
            }
            writer.close();
        } catch (IOException ex) {
            System.out.println("konnte die Bekanntenliste nicht schreiben");
            ex.printStackTrace();
        }
    }


    // datei Laden
    public void dateiLaden(File datei) {
        try {
            BufferedReader reader = new BufferedReader(new FileReader(datei));
            String zeile = null;
            while ((zeile = reader.readLine()) != null) {
                bekannteEinlesen(zeile);
            }
            reader.close();
        } catch (IOException ex) {
            System.out.println("konnte die Bekanntenliste nicht lesen");
            ex.printStackTrace();
        }
    }


    // testfunktion, die aus den gelesenen zeilen einen Neuen Bekannten erstellt
    private void bekannteEinlesen(String zuParsendeZeile) {
        String[] zeile = zuParsendeZeile.split("/");
        Bekannter bekannter = new Bekannter();
        bekannter.setArt(zeile[0]);
        bekannter.setName(zeile[1]);
        bekannter.setAdresse(zeile[2]);
        bekannter.setEmailadresse(zeile[3]);
        bekannter.setGeburtstag(zeile[4]);
        bekannter.setHandynummer(zeile[5]);
        bekannter.setNotizen(zeile[6]);
        bekannter.setTelefonnummer(zeile[7]);
        bekannter.setVerwandtschaftsart(zeile[8]);
        list.add(bekannter);
        iterator = list.listIterator();
    }


}
 

Oben