JPanel problem

yax

Bekanntes Mitglied
Hallöchen,
Also ich bräuchte mal wieder eure hilfe, ich habe ein JFrame mit einen Button. Wenn ich auf den Button Drücke, entsteht im selben Fenster ein neues Panel mit einen Label. Aber wenn ich dass Programm schließe, öffnet sich ein Dialog, indem man einen Namen für eine Datei angeben kann, in der die Daten gespeichert werden. Doch wenn ich das Programm öffne, und die Datei öffne, wird mir alles dreifach angezeigt. Hat vielleicht jemand eine Idee??

Hier mein Code:

Java:
import java.awt.BorderLayout;
import java.awt.Dimension;
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.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.ArrayList;
import java.util.List;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFileChooser;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;

public class Passwortmanager extends JFrame implements ActionListener, WindowListener {

  private final List<String> values = new ArrayList<String>();

  private JPanel listPanel;

  private JButton addButton;

  private JButton closeButton;

  public Passwortmanager() {
    this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    this.addWindowListener(this);
    this.setTitle("Passwortmanager(Test)");
    this.setContentPane(createMainPanel());
    this.pack();

    queryFile();

  }

  private JPanel createMainPanel() {

    listPanel = new JPanel();
    listPanel.setPreferredSize(new Dimension(400, 200));
    listPanel.setBorder(BorderFactory.createEtchedBorder());
    JScrollPane pane = new JScrollPane(listPanel);

    addButton = new JButton("Hinzufügen");
    addButton.addActionListener(this);
    closeButton = new JButton("Schließen");
    closeButton.addActionListener(this);

    JPanel buttonPanel = new JPanel();
    buttonPanel.setBorder(BorderFactory.createEtchedBorder());
    buttonPanel.add(addButton);
    buttonPanel.add(closeButton);

    JPanel panel = new JPanel();
    panel.setLayout(new BorderLayout());
    panel.add(pane, BorderLayout.CENTER);
    panel.add(buttonPanel, BorderLayout.SOUTH);
    return panel;

  }

  private void queryFile() {
    JFileChooser chooser = new JFileChooser();
    int retVal = chooser.showOpenDialog(this);
    if (retVal == JFileChooser.APPROVE_OPTION) {
      File file = chooser.getSelectedFile();
      loadFromFile(file);
    }
  }

  private void loadFromFile(File file) {
    try {
      BufferedReader reader = new BufferedReader(new FileReader(file));
      String line = "";
      while ((line = reader.readLine()) != null) {
        values.add(line);
        addInformation(line);
      }
      reader.close();
    } catch (FileNotFoundException e) {
      System.out.println("konnte die Datei nicht finden.");
    } catch (IOException e) {
      System.out.println("Beim laden der Datei ist ein Fehler aufgetreten");
    }
  }

  private void writeToFile(File file) {
    try {
      PrintWriter writer = new PrintWriter(new FileOutputStream(file));
      for (String name : values) {
        writer.println(name);
      }
      writer.close();
    } catch (FileNotFoundException e) {
      System.err.println("Konnte nicht in die Datei schreiben.");
      return;
    }
  }

  private void addInformation(String name) {
    values.add(name);

    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createEtchedBorder());
    panel.add(new JLabel("Name: " + name));
    listPanel.add(panel);
    this.pack();
  }

  public void actionPerformed(ActionEvent e) {
    Object source = e.getSource();
    if (source == addButton) {
      String name = JOptionPane.showInputDialog("Bitte Benutzernamen eingeben: ");
      String passwort = JOptionPane.showInputDialog("Bitte Passwort eingeben: ");
      String website = JOptionPane.showInputDialog("Bitte Namen der Website eingeben: ");
      addInformation(name);
    } else if (source == closeButton) {
      windowClosing(new WindowEvent(this, WindowEvent.WINDOW_CLOSING));
      this.setVisible(false);
    }
  }

  public void windowOpened(WindowEvent e) {

  }

  public void windowClosing(WindowEvent e) {
    if (values.isEmpty()) {
      return;
    }

    JFileChooser chooser = new JFileChooser();
    int retVal = chooser.showSaveDialog(this);
    if (retVal == JFileChooser.APPROVE_OPTION) {
      File file = chooser.getSelectedFile();
      writeToFile(file);
    }

    System.exit(0);

  }

  public void windowClosed(WindowEvent e) {

  }

  public void windowIconified(WindowEvent e) {

  }

  public void windowDeiconified(WindowEvent e) {

  }

  public void windowActivated(WindowEvent e) {

  }

  public void windowDeactivated(WindowEvent e) {

  }

  public static void main(String[] args) {
    final Passwortmanager pm = new Passwortmanager();
    java.awt.EventQueue.invokeLater(new Runnable() {
      public void run() {
        pm.setVisible(true);
      }
    });
  }

}
 
Mhm, also was mir beim Überfliegen so auffällt ist:
- in loadFromFile rufst du valued.add(..) und danach addInformation auf, in addInfo rufst du allerdings nochmal values.add auf
Wenn du dann ndie Datei liest hast du also den Namen schon 2 x drin usw...
 
?? Dein Problem war doch, dass alles mehrfach auftaucht wenn du die Datei lädst?! Ich habe dir nur gesagt woran es liegen könnte, ein Lösungsvorschlag wurde hier doch noch gar nicht genannt...kommentiere Zeile 85 aus, das wäre ein Vorschlag, der zumindest auch bei mir funktioniert. Erkläre doch mal was du genau wünschst, was passiert, etc. Oder wie genau man dein Verhalten rekonstruieren kann?! Vllt. benutzt du dein eigenes Programm ja auch falsch *g*
Wenn du bei jedem Laden jeden Namen doppelt in den Vector schmeisst, ist es doch klar dass der dann öfters geschrieben, und beim nächsten Mal eben öfters gelesen wird..???:L
 

Neue Themen


Zurück
Oben