JPanel Problem

So, ich habe dies jetzt für ein Panel hinbekommen. Aber wie kann ich denn mehrere Panels mit anderen Informationen gleichzeitig öffnen ?
 
Zuletzt bearbeitet:
Hier ein kleines Beispiel ohne Anspruch auf Vollständigkeit ;)
Es fragt dich am Anfang ob du eine Datei laden willst, wenn du auf Cancle drückst wird die normale Gui geöffnet. Wenn du schonmal eine Datei gespeichert hast und die wieder lädst werden die Information eingelesen und angezeigt.
Wenn du das Programm beenden willst und Information vorher eingeben hast, dann fragt es dich, wo es die speichern soll.

Code:
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 SimpleGui extends JFrame implements ActionListener, WindowListener {

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

  private JPanel listPanel;

  private JButton addButton;

  private JButton closeButton;

  public SimpleGui() {
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.addWindowListener(this);
	this.setTitle("Simple test program.");
	this.setContentPane(createMainPanel());
	this.pack();

	queryFile();

  }

  private JPanel createMainPanel() {

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

	addButton = new JButton("Add");
	addButton.addActionListener(this);
	closeButton = new JButton("Quit");
	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("Could not find file.");
	} catch (IOException e) {
	  System.out.println("Something went wrong during fileparsing.");
	}
  }  

  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("Could not write to file.");
	  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 Namen 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 SimpleGui gui = new SimpleGui();
	java.awt.EventQueue.invokeLater(new Runnable() {
	  public void run() {
		gui.setVisible(true);
	  }
	});
  }

}
 
So, nach deiner Hilfe habe ich jetzt so etwas ähnliches selber geschrieben. Aber wenn ich eine Datei öffne, wird mir alles dreifach angezeigt.

Hier mein Code:

Code:
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, line, 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, String passwort, String website) {
    values.add(name);
    values.add(passwort);
    values.add(website);
    JPanel panel = new JPanel();
    panel.setBorder(BorderFactory.createEtchedBorder());
    panel.add(new JLabel("Name: " + name + " | Passwort: " + passwort + " | Website: " + website));
    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, passwort, website);
    } 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);
      }
    });
  }

}

Könnte mir da denn jemand helfen****
 
Hallo,

Was für mich grad komisch aussieht, ist, dass du die eingelesene Zeile viermal hinzufügst...
Und zwar: In Zeile 85 sowie in den Zeilen 110, 111, 112.

Kommt natürlich drauf an, wie du mit "values" dann weiter umgehst, aber das würde ich mir nochmal anschauen.

Gruß,
Martin
 
Okay, ich hab jetzt eigentlich alles ausprobiert an diesen stellen was nur geht, aber es wird entweder falsch ausgegeben oder es wird öfters angezeigt. Gibt es noch eine andere mögliche Lösung?
 
Das Problem ist, dass so wie du es jetzt machst, du für jede Information eine Zeile in deiner Datei anlegst. Also eine Zeile für den Namen, eine Zeile für das Passwort ... Wenn du die Datei dann Zeilenweise ausliest wird natürlich für jede Zeile ein neues Panel angelegt, weil du ja mit .readLine() immer genau eine Zeile ausliest. Also erscheint ein Panel für den Namen, und auf dem Panel selbst erscheint dann 3 mal der Name statt Name, Passwort etc.
Um das zu lösen fallen mir spontan schon mehrere Lösungen ein. Du könntest dir zum Beispiel eine kleine Klasse schreiben, in der du den Namen, dass Passwort und was du sonst noch haben willst speicherst und diese Klassen dann in der Liste values ablegst. Beim Speichern, schreibst du dann die Informationen, die zusammen gehören alle zusammen in eine Zeile. Also statt:
Name
Passwort
...

Name, Passwort, ...

Wenn du dann die Datei wieder einliest steht in dem String line dann die ganze Zeile drin und du musst den String nur noch zerlegen und die addInformation Methode wie gehabt aufrufen.

Gruß
Der Wolf
 
Also soll ich einfach eine Klasse mit den Variablen und einen Konstruktor schreiben und den dann in values ablegen ?

Irgendwie verstehe ich jetzt gar nichts mehr....
 
Zuletzt bearbeitet:
Du kannst dir zum Beispiele eine kleine Klasse schreiben ... etwa so:

Code:
public class DataContainer {

      private String name;

      private String passwd;

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

      public String getName() {
           return name;
      }

      public void setPasswd(String passwd) {
           this.passwd = passwd;
       }
   
      public String getPasswd() {
            return passwd;
      }

}

Da speicherst du dann die Eingaben deiner dialogs drin und legst die aktuelle Instanz der Klasse in der Liste ab.
Nacher gehst du die Liste durch und baust dir zum Beispiel aus den Infos da drin nen String zusammen, z.B,:

Code:
DataContainer container = values.get(1);
String line = container.getName() + ", " + container.getPasswd(),

und schreibst diesen String in der Write to File Methode per println in die Datei.
Beim einlesen machst du es dann genau umgekehrt. Liest die Zeile über readLine() ein. Dann bekommst du ja einen String den du über .split(",") am Komma trennen kannst und hast dann ein String array mit 2 Feldern, wo die einzelnen Infos drin stehen. Damit rufst du dann deine addInformation Methode auf.
 
Entschuldigung dass ich die ganze Zeit frage oder so, aber ich werd noch ganz verückt :D

Meine List nimmt die Instanz der Klasse nicht an...
 
Zurück