Hauptfenster öffnet sich mehrmals

Brymax

Mitglied
Hallo zusammen,

ich hab mich mal hier angemeldet weil ich ein Problem habe das ich seit 3 Tagen nicht gelöst bekomme.

Dieser Code:
Java:
package pw_generator_neu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;

public class Save extends JDialog implements ActionListener, ItemListener
{  
    ArrayList<Passwort> lst = new ArrayList<Passwort>();
    String txt = "passwörter.txt";
  
    public static void laden(String datei, ArrayList<Passwort> daten)
    {
        FileReader fr = null;
        BufferedReader br = null;
      
        try
        {
            fr = new FileReader(datei);
            br = new BufferedReader(fr);
            String zeile = "";
          
            try
            {
                while((zeile = br.readLine()) != null)
                {
                    String[] werte = zeile.split(",");
                    String portal = werte[0];
                    String benutzerkennung = werte[1];
                    String passwort = werte[2];
                    Passwort temp = new Passwort(portal, benutzerkennung, passwort);
                    daten.add(temp);
                }
            }
            catch(NullPointerException ex)
            {
                ;
            }
        }
        catch(IOException ex)
        {
            System.out.println(ex.getMessage());
        }
        finally
        {
            try
            {
                br.close();
            }
            catch(IOException ex)
            {
                System.out.println(ex.getMessage());
            }
        }
    }
  
    private Color farbe2 = new Color(108, 166, 205);
    private Color farbe3 = new Color(000, 000, 000);
  
    private Border bo;
    private TitledBorder tbo;
  
    private JPanel pnlP;
  
    private JLabel lblF, lblK, lblP;
  
    private JTextField txtK, txtP;
  
    private JButton btnÖffnen, btnSchliessen;
  
    private JComboBox<Passwort> cbPasswort;
  
    public Save(JFrame elternfenster, String beschriftung)
    {
        super(elternfenster, beschriftung, true);
        this.setSize(400, 275);
        this.setResizable(false);
        this.setLayout(null);
        this.getContentPane().setBackground(farbe2);
        this.setLocationRelativeTo(elternfenster);
      
        bo = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
        tbo = BorderFactory.createTitledBorder(bo, "Gespeicherte Passwörter");
        tbo.setTitleFont(new Font("Arial",Font.BOLD,14));
        tbo.setTitleColor(farbe3);
      
        pnlP = new JPanel();
        pnlP.setLayout(null);
        pnlP.setBounds(7, 25, 380, 150);
        pnlP.setBorder(tbo);
        pnlP.setBackground(farbe2);
        this.getContentPane().add(pnlP);
      
        lblF = new JLabel("Bezeichnung");
        lblF.setBounds(25, 35, 100, 20);
        lblF.setForeground(farbe3);
        pnlP.add(lblF);
        lblK = new JLabel("Benutzerkennung");
        lblK.setBounds(25, 60, 100, 20);
        lblK.setForeground(farbe3);
        pnlP.add(lblK);
        lblP = new JLabel("Passwort");
        lblP.setBounds(25, 85, 100, 20);
        lblP.setForeground(farbe3);
        pnlP.add(lblP);
      
        cbPasswort = new JComboBox<Passwort>();
        cbPasswort.setBounds(150, 35, 150, 20);
        this.getContentPane().add(cbPasswort);
        pnlP.add(cbPasswort);
        cbPasswort.addItemListener(this);
      
        txtK = new JTextField();
        txtK.setBounds(150, 60, 150, 20);
        txtK.setBorder(null);
        txtK.setBackground(farbe2);
        pnlP.add(txtK);
        txtP = new JTextField();
        txtP.setBounds(150, 85, 150, 20);
        txtP.setBorder(null);
        txtP.setBackground(farbe2);
        txtP.setEditable(false);
        pnlP.add(txtP);
      
        btnÖffnen = new JButton("Öffnen");
        btnÖffnen.setBounds(95, 200, 100, 30);
        this.getContentPane().add(btnÖffnen);
        btnÖffnen.addActionListener(this);
        btnSchliessen = new JButton("Abbrechen");
        btnSchliessen.setBounds(205, 200, 100, 30);
        this.getContentPane().add(btnSchliessen);
        btnSchliessen.addActionListener(this);
      
        this.setVisible(true);
    }

    private void aktualisieren()
    {
  
    }
  
    public void itemStateChanged(ItemEvent ie)
    {  
  
    }
  
    public void actionPerformed(ActionEvent e)
    {
        String welcher = e.getActionCommand();
      
        if(welcher.equals("Öffnen"))
        {
            laden(txt, lst);
        }
        if(welcher.equals("Abbrechen"))
        {
            this.dispose();
        }
    }
}

sorgt dafür das sich das Hauptfenster nachdem man Öffnen geklickt hat so oft öffnet wie in der "passwörter.txt" zeilen enthalten sind. Sprich habe ich insgesamt 5 datenzeilen in der txt wird danach auch 5 mal das Hauptfenster geöffnet. Ich habe nach unzähligem probieren keine lösung gefunden um das zu unterbinden. Das Lustige ist ich hab ein weiteres Fenster das genau das selbe macht mit dem unterschied das ich da noch mit dem Filewriter die Datei erzeuge. Aber auch dieses Fenster läd die daten nach nem Buttonklick aber öffnet das Hauptfenster nicht neu.

Da es insgesamt viel code ist poste ich nur mal die klasse mit dem genannten Problem und hoffe ihr habt so ne antwort parat.
Der Code ist noch sehr Spagettihaft. Bitte verzeiht mir das bin erst seit 8 Wochen in Java und hab noch nicht die übung.

Vielen Dank schonmal für eure Hilfe
 
Zuletzt bearbeitet von einem Moderator:
sorgt dafür das sich das Hauptfenster nachdem man Öffnen geklickt hat so oft öffnet wie in der "passwörter.txt" zeilen enthalten sind. Sprich habe ich insgesamt 5 datenzeilen in der txt wird danach auch 5 mal das Hauptfenster geöffnet. Ich habe nach unzähligem probieren keine lösung gefunden um das zu unterbinden.

Also ich nehme an es geht hier im Grund um die while-Schleife in deiner statischen Methode "laden" oder?
Wenn ja sehe ich dort keinen Code auf welchen ich schließen kann das ein Fenster aufgeht.
Was ist denn Passwort für eine Klasse bzw. für was ist sie zuständig?

EDIT: Ein leere catch-Block ist immer falsch! Du solltest auch wenn da eine NullPointerException fliegt etwas ausgeben bzw. kontrollieren warum eine fliegt und ob sich das nicht vermeiden lässt!
 
Genau das mein Problem ich seh nicht inwieweit ich in deisem code irgendwie erwähne das er das Hauptfenster öffnen soll.

Das Passwortfenster macht eigentlich nichts ausser die Daten zurückzugeben

Java:
package pw_generator_neu;

public class Passwort extends generator
{
    private String portal;
    private String benutzerkennung;
    private String passwort;
   
    public Passwort(String p, String bnk, String pw)
    {
        this.portal = p;
        this.benutzerkennung = bnk;
        this.passwort = pw;
    }

    public String getPortal()
    {
        return portal;
    }
   
    public String getBenutzerkennung()
    {
        return benutzerkennung;
    }
   
    public String getPasswort()
    {
        return passwort;
    }
   
    public String toString()
    {
        return portal;
    }
}

Die "toString" Brauch ich später für ne ComboBox.

Zu dem leeren Catch das hat mir mein Dozent so gezeigt der seit 25 Jahren Programmiert. Ich dachte das mach ich dann auch mal besser so^^
 
Genau das mein Problem ich seh nicht inwieweit ich in deisem code irgendwie erwähne das er das Hauptfenster öffnen soll.
Vielleicht solltest du mal erklären was dein Hauptfenster ist? Wo in deinem (kompletten) Code wird ein neues Objekt deines Hauptfenster erstellt?
Das sind die interessanten Stellen! Wird etwas davon öfters aufgerufen bzw. liegt in einer Schleife?

Das Passwortfenster macht eigentlich nichts ausser die Daten zurückzugeben
Ich habe was über die Klasse "Passwort" gefragt nicht ein Passwortfenster 😉 oder handelt es sich bei der Klasse "Passwort" auch um jene Klasse welche das Passwortfenster erzeugt?

Zu dem leeren Catch das hat mir mein Dozent so gezeigt der seit 25 Jahren Programmiert. Ich dachte das mach ich dann auch mal besser so^^
Auch wenn er schon 50 Jahre und mehr programmiert: Ein catch-Block sollte nicht leer bleiben, nie! Und wenn es nur eine einfache Meldung ist das eine NPE passiert ist, aber so weiß man als Entwickler wenigstens dass was passiert ist.
 
Ok von vorne. Ich Bastel nen Passwortgenerator

Das Hauptfenster sieht so aus:
Java:
package pw_generator_neu;
import java.awt.*;
import java.awt.datatransfer.*;
import java.awt.event.*;
import java.util.*;
import javax.swing.*;
import javax.swing.border.*;
import javax.swing.event.*;

public class generator extends JFrame implements ItemListener, ActionListener, ChangeListener
{
 
    private Color farbe1 = new Color(135, 206, 255);
    private Color farbe2 = new Color(108, 166, 205);
    private Color farbe3 = new Color(000, 000, 000);
    private Border bor;
    private TitledBorder tbor, tbor2;
    private JMenuBar mb;
    private JMenuItem misave, miopen;
    private JPanel pnleinst, pnlzeichen;
    private JTextField txtzusatz, txtPwa;
    private JCheckBox chkalles, chkziffern, chkkb, chkgb, chksonderzeichen;
    private JRadioButton rbvorne, rbhinten;
    private JLabel lblwieviel, lblzusatz, lblpwa;
    private JButton btnGen, btnSp, btnzwi, btnges;
    private ButtonGroup gruppe;
    private JSlider sli;
    private Random zufall;
 
    private ImageIcon bild;
 
    private int anzahl;
 
    private String pw = ""; 
    private String allegb = "ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜ";
    private String allekb = "abcdefghijklmnopqrstuvwxyzöäü";
    private String alleziffern = "0123456789";
    private String allesonderzeichen = "€#$§?!%&*@";
    private String alles = "ABCDEFGHIJKLMNOPQRSTUVWXYZÖÄÜabcdefghijklmnopqrstuvwxyzöäü0123456789€#$§?!%&*@";
    private String alle = alles;


    public generator()
    {
        this.setTitle("Passwort generator v.0.20");
        this.setSize(500, 600);
        this.setResizable(false);
        this.setLayout(null);
        this.setLocation(700, 250);
        this.setDefaultCloseOperation(EXIT_ON_CLOSE);
        this.getContentPane().setBackground(farbe2);
     
        mb = new JMenuBar();
        JMenu mnuDatei = new JMenu("Datei");
        mb.add(mnuDatei);
        JMenu mnuHilfe = new JMenu("Hilfe");
        mb.add(mnuHilfe);
        mb.setBackground(farbe1);
        mb.setBorder(null);
        this.setJMenuBar(mb);
     
        miopen = new JMenuItem("Datei Speichern");
        mnuDatei.add(miopen);
        miopen.addActionListener(this);
        misave = new JMenuItem("Datei Öffnen");
        mnuDatei.add(misave);
        misave.addActionListener(this);
     
        bor = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
        tbor = BorderFactory.createTitledBorder(bor, "Einstellungen");
        tbor.setTitleFont(new Font("Arial",Font.BOLD,14));
        tbor.setTitleColor(farbe3);
     
        tbor2 = BorderFactory.createTitledBorder(bor, "Zeichen");
        tbor2.setTitleFont(new Font("Arial",Font.BOLD,14));
        tbor2.setTitleColor(farbe3);
     
        pnlzeichen = new JPanel();
        pnlzeichen.setLayout(null);
        pnlzeichen.setBounds(7, 25, 480, 100);
        pnlzeichen.setBorder(tbor2);
        pnlzeichen.setBackground(farbe2);
        this.getContentPane().add(pnlzeichen);
     
        pnleinst = new JPanel();
        pnleinst.setLayout(null);
        pnleinst.setBounds(7, 135, 480, 200);
        pnleinst.setBorder(tbor);
        pnleinst.setBackground(farbe2);
        this.getContentPane().add(pnleinst);
     
        //Checkboxen
        chkalles = new JCheckBox("Alle Zeichen", true);
        chkalles.setBounds(280, 30, 100, 20);
        chkalles.setBackground(farbe2);
        chkalles.setForeground(farbe3);
        pnlzeichen.add(chkalles);
        chkalles.addItemListener(this);
        chkgb = new JCheckBox("Großbuchstaben", false);
        chkgb.setBounds(10, 30, 120, 20);
        chkgb.setBackground(farbe2);
        chkgb.setForeground(farbe3);
        pnlzeichen.add(chkgb);
        chkgb.addItemListener(this);
        chkkb = new JCheckBox("Kleinbuchstaben", false);
        chkkb.setBounds(10, 55, 120, 20);
        chkkb.setBackground(farbe2);
        chkkb.setForeground(farbe3);
        pnlzeichen.add(chkkb);
        chkkb.addItemListener(this); 
        chkziffern = new JCheckBox("Ziffern", false);
        chkziffern.setBounds(150, 30, 70, 20);
        chkziffern.setBackground(farbe2);
        chkziffern.setForeground(farbe3);
        pnlzeichen.add(chkziffern);
        chkziffern.addItemListener(this);
        chksonderzeichen = new JCheckBox("Sonderzeichen", false);
        chksonderzeichen.setBounds(150, 55, 120, 20);
        chksonderzeichen.setBackground(farbe2);
        chksonderzeichen.setForeground(farbe3);
        pnlzeichen.add(chksonderzeichen);
        chksonderzeichen.addItemListener(this);
     
        lblzusatz = new JLabel("Folgendes Wort an Passwort hängen");
        lblzusatz.setBounds(10, 30, 220, 20);
        lblzusatz.setForeground(farbe3);
        pnleinst.add(lblzusatz);
     
        txtzusatz = new JTextField();
        txtzusatz.setBounds(240, 30, 100, 20);
        txtzusatz.setBorder(null);
        pnleinst.add(txtzusatz);
     
        gruppe = new ButtonGroup();
     
        rbvorne = new JRadioButton("Wort an Anfang setzen");
        rbvorne.setBounds(235, 60, 200, 20);
        rbvorne.setBackground(farbe2);
        rbvorne.setForeground(farbe3);
        pnleinst.add(rbvorne);
        rbhinten = new JRadioButton("Wort an Ende setzen");
        rbhinten.setBounds(235, 85, 200, 20);
        rbhinten.setBackground(farbe2);
        rbhinten.setForeground(farbe3);
        pnleinst.add(rbhinten);
        gruppe.add(rbvorne);
        gruppe.add(rbhinten);
     
        lblwieviel = new JLabel("Passworlänge");
        lblwieviel.setBounds(10, 110, 100, 20);
        lblwieviel.setForeground(farbe3);
        pnleinst.add(lblwieviel);
     
        sli = new JSlider();
        pnleinst.add(sli);
        sli.setBounds(120, 110, 200, 50);
        sli.setBackground(farbe2);
        sli.setMinimum(0);
        sli.setMaximum(20);
        sli.setMajorTickSpacing(5);
        sli.setMinorTickSpacing(1);
        sli.setSnapToTicks(true);
        sli.setPaintTicks(true);
        sli.setPaintLabels(true);
        sli.createStandardLabels(1);
        sli.setValue(8);
        sli.addChangeListener(this);
     
        lblpwa = new JLabel("Neues Passwort");
        lblpwa.setBounds(195, 350, 100, 20);
        lblpwa.setForeground(farbe3);
        this.getContentPane().add(lblpwa);
     
        txtPwa = new JTextField();
        txtPwa.setBounds(155, 380, 180, 20);
        this.getContentPane().add(txtPwa);
        txtPwa.setEditable(false);
     
        bild = new ImageIcon("img/SpeicherBild.png");
     
        btnGen = new JButton("Passwort Generieren");
        btnGen.setBounds(40, 420, 200, 40);
        this.getContentPane().add(btnGen);
        btnGen.addActionListener(this);
        btnSp = new JButton("Speichern");
        btnSp.setBounds(250, 420, 200, 40);
        this.getContentPane().add(btnSp);
        btnSp.addActionListener(this);
        btnzwi = new JButton();
        btnzwi.setBounds(350, 373, 35, 35);
        this.getContentPane().add(btnzwi);
        btnzwi.addActionListener(this);
        btnzwi.setIcon(bild);
        btnges = new JButton("Gespeicherte Passwörter");
        btnges.setBounds(150, 475, 200, 40);
        this.getContentPane().add(btnges);
        btnges.addActionListener(this);
     
        this.setVisible(true);
     
        anzahl = 8;
    }

    public void actionPerformed(ActionEvent ae)
    {
        try
        {
            String welcher = ae.getActionCommand();     
            zufall = new Random();
            pw = "";

            if(welcher.equals("Passwort Generieren"))
            {     
                if(rbvorne.isSelected() == true)
                {
                    String tmp = txtzusatz.getText();
                 
                    for(int i = 0; i < anzahl; i++)
                    {         
                        char zufallszeichen = alle.charAt(zufall.nextInt(alle.length()));
                        pw += zufallszeichen;
                    }
                    txtPwa.setText(tmp + pw);
                }
                if(rbhinten.isSelected() == true)
                {
                    String tmp = txtzusatz.getText();
                 
                    for(int i = 0; i < anzahl; i++)
                    {         
                        char zufallszeichen = alle.charAt(zufall.nextInt(alle.length()));
                        pw += zufallszeichen;
                    }
                    txtPwa.setText(pw + tmp);
                }
                if(rbhinten.isSelected() == false && rbvorne.isSelected() == false)
                {
                    String tmp = txtzusatz.getText();
                 
                    for(int i = 0; i < anzahl; i++)
                    {         
                        char zufallszeichen = alle.charAt(zufall.nextInt(alle.length()));
                        pw += zufallszeichen;
                    }
                    txtPwa.setText(pw);
                }
            }
            if(welcher.equals("Speichern"))
            {
                String pwr = txtPwa.getText();
                new Speichern(this, "Speichern", pwr);
            }
            if(ae.getSource().equals(btnzwi))
            {
                Toolkit.getDefaultToolkit().getSystemClipboard().setContents(new StringSelection(txtPwa.getText()), null);
            }
            if(welcher.equals("Gespeicherte Passwörter"))
            {
                new Save(this, "Gespeicherte Passwörter");
            }
        }
        catch (NumberFormatException ex)
        {
            JOptionPane.showMessageDialog(this, "Bitte Zahlen eingeben");
        }
    }

    public void itemStateChanged(ItemEvent ie)
    {
        alle = "";
 
        if(chkgb.isSelected() == false && chkkb.isSelected() == false && chkziffern.isSelected() == false
                && chksonderzeichen.isSelected() == false && chkalles.isSelected() == false)
        {
            JOptionPane.showMessageDialog(this, "Es muss ein Feld ausgewählt sein");
        }
        else
        {     
            if(chkgb.isSelected() == true)
            {
                alle += allegb;
                chkalles.setSelected(false);
            }
            if(chkkb.isSelected() == true)
            {
                alle += allekb; 
                chkalles.setSelected(false);
            }
            if(chkziffern.isSelected() == true)
            {
                alle += alleziffern;
                chkalles.setSelected(false);
            }
            if(chksonderzeichen.isSelected() == true)
            { 
                alle += allesonderzeichen;
                chkalles.setSelected(false);
            }
            if(chkalles.isSelected() == true)
            {
                alle += alles;
            }
        }
    }

    public void stateChanged(ChangeEvent e)
    {
        anzahl = sli.getValue();
    }  
}

Nachdem man das Passwort generieren lassen hat kann man auf speichern klicken und er Öffenen inen Dialog der so aussieht

Java:
package pw_generator_neu;
import java.awt.*;
import java.awt.event.*;
import java.io.*;
import java.util.ArrayList;
import javax.swing.*;
import javax.swing.border.*;

public class Speichern extends JDialog implements ActionListener
{
    ArrayList<Passwort> lstpsw = new ArrayList<Passwort>();
    String datei = "passwörter.txt";
 
    public void speichern(String datei, ArrayList<Passwort> daten)
    {
        FileWriter fw = null;
        BufferedWriter bw = null;
         
        try
        {
            fw = new FileWriter(datei);
            bw = new BufferedWriter(fw);
         
            for(Passwort p : daten)
            {
                bw.write(String.valueOf(p.getPortal()));
                bw.write(",");
                bw.write(String.valueOf(p.getBenutzerkennung()));
                bw.write(",");
                bw.write(String.valueOf(p.getPasswort()));
                bw.newLine();
            }
         
        }
        catch(IOException ex)
        {
            System.out.println(ex.getMessage());
        }
        finally
        {
            try
            {
                bw.close();
            }
            catch(IOException ex)
            {
                System.out.println(ex.getMessage());
            }
        }
    }
 
    public void öffnen(String datei, ArrayList<Passwort> daten)
    {
        FileReader fr = null;
        BufferedReader br = null;
     
        try
        {
            fr = new FileReader(datei);
            br = new BufferedReader(fr);
            String zeile = "";
         
            try
            {
                while((zeile = br.readLine()) != null)
                {
                    String[] werte = zeile.split(",");
                    String portal = werte[0];
                    String benutzerkennung = werte[1];
                    String passwort = werte[2];
                    Passwort temp = new Passwort(portal, benutzerkennung, passwort);
                    daten.add(temp);
                }
            }
            catch(NullPointerException ex)
            {
                ;
            }
        }
        catch(IOException ex)
        {
            System.out.println(ex.getMessage());
        }
        finally
        {
            try
            {
                br.close();
            }
            catch(IOException ex)
            {
                System.out.println(ex.getMessage());
            }
        }
    }
 
    private Color farbe1 = new Color(135, 206, 255);
    private Color farbe2 = new Color(108, 166, 205);
    private Color farbe3 = new Color(000, 000, 000);
 
    private Border bor;
    private TitledBorder tbor;
 
    private JPanel pnleinst;
 
    private JLabel lblfür, lblken, lblpw;
 
    private JTextField txtfür, txtken, txtpw;
 
    private JButton btnspeichern, btnexit;
 
 

    public Speichern(JFrame elternfenster, String beschriftung, String pw)
    {
        super(elternfenster, beschriftung, true);
        this.setSize(400, 275);
        this.setResizable(false);
        this.setLayout(null);
        this.getContentPane().setBackground(farbe2);
        this.setLocationRelativeTo(elternfenster);
     
        bor = BorderFactory.createEtchedBorder(EtchedBorder.LOWERED);
        tbor = BorderFactory.createTitledBorder(bor, "Einstellungen");
        tbor.setTitleFont(new Font("Arial",Font.BOLD,14));
        tbor.setTitleColor(farbe3);
     
        pnleinst = new JPanel();
        pnleinst.setLayout(null);
        pnleinst.setBounds(7, 25, 380, 150);
        pnleinst.setBorder(tbor);
        pnleinst.setBackground(farbe2);
        this.getContentPane().add(pnleinst);
     
        lblfür = new JLabel("Bezeichnung");
        lblfür.setBounds(25, 35, 100, 20);
        lblfür.setForeground(farbe3);
        pnleinst.add(lblfür);
        lblken = new JLabel("Benutzerkennung");
        lblken.setBounds(25, 60, 100, 20);
        lblken.setForeground(farbe3);
        pnleinst.add(lblken);
        lblpw = new JLabel("Passwort");
        lblpw.setBounds(25, 85, 100, 20);
        lblpw.setForeground(farbe3);
        pnleinst.add(lblpw);
     
        txtfür = new JTextField();
        txtfür.setBounds(150, 35, 150, 20);
        txtfür.setBorder(null);
        pnleinst.add(txtfür);
        txtken = new JTextField();
        txtken.setBounds(150, 60, 150, 20);
        txtken.setBorder(null);
        pnleinst.add(txtken);
        txtpw = new JTextField();
        txtpw.setBounds(150, 85, 150, 20);
        txtpw.setBorder(null);
        txtpw.setEditable(false);
        pnleinst.add(txtpw);
        txtpw.setText(pw);
     
        btnspeichern = new JButton("Speichern");
        btnspeichern.setBounds(95, 200, 100, 30);
        this.getContentPane().add(btnspeichern);
        btnspeichern.addActionListener(this);
        btnexit = new JButton("Abbrechen");
        btnexit.setBounds(205, 200, 100, 30);
        this.getContentPane().add(btnexit);
        btnexit.addActionListener(this);
  
        this.setVisible(true);
    }

    public void actionPerformed(ActionEvent ae)
    {
        String welcher = ae.getActionCommand();
     
        if(welcher.equals("Speichern"))
        {
            öffnen(datei, lstpsw);
            String tmp1 = txtfür.getText();
            String tmp2 = txtken.getText();
            String tmp3 = txtpw.getText();
            lstpsw.add(new Passwort(tmp1, tmp2, tmp3));
            speichern(datei, lstpsw);
            JOptionPane.showMessageDialog(this, "Passwort gespeichert!");
        }
        if(welcher.equals("Abbrechen"))
        {
            this.dispose();
        }
    }
}

Auch in diesem ist der Code mit dem Problemfenster sprich das laden der "txt" Datei. Hier macht er das aber tatellos. Das Fenster dient rein dazu die Passwörter in einer Datei zu Speichern.

Wenn man auf "Gespeicherte Passwörter" klickt kommt das Fenster das das Hauptfenster beim laden der "txt" Datei mehrmals öffnet. Das Fenster soll die Daten aus der gespeicherten Datei Laden in ner ArrayList Speichern damit ich diese später in ne Combobox transferieren kann.

Sry hab mich verschrieben beim "Passwortfenster". Das ist die gefragte Passwortklasse. Die tut nichts ausser die Daten zurückgeben. Die erstellt kein neues Fenster oder sonstiges

Ich hoffe du bekommst keinen Schreikrampf wenn du dich da durchquälst^^

Edit: Die "main" klasse habe ich ausgelagert. Steht nur new generator();
 
Sry hab mich verschrieben beim "Passwortfenster". Das ist die gefragte Passwortklasse. Die tut nichts ausser die Daten zurückgeben. Die erstellt kein neues Fenster oder sonstiges

Und genau hier liegt dein Denkfehler! 😉
Jedes neues Objekt deiner Klasse "Passwort" erzeugt ein neues Hauptfenster!

Warum? -> public class Passwort extends generator
Bevor der Konstruktor der Klasse "Passwort" ausgeführt wird müssen die Konstruktoren der Oberklassen ausgeführt werden.
Im Konstruktor von "generator" erzeugst du eben dein Hauptfenster.

Warum leitet die Klasse Passwort von "generator" ab? Gibt es einen guten Grund dafür?



Anmerkungen zu deinem Code:
Man sollte nicht von JFrame ableiten wenn man nicht dessen Funktionalität erweitern/anpassen will! (Layout ist keine Funktionalität!)
java - Why shouldn't you extend JFrame and other components? - Stack Overflow
Klassennamen beginnen immer mit einem Großbuchstaben
if(rbvorne.isSelected() == true) -> hier kannst du das "== true" auch einfach weglassen. Das Ergebnis des Vergleichs ist ein boolean, isSelected selbst gibt aber auch schon ein boolean zurück 😉
Du solltest dich mal mit den LayoutManager auseinander setzen, damit lässt sich das Layout einfacher gestalten und anpassen/erweitern (persönliche Meinung)
Bessere Variante für deine Variable "alles" -> private String alles = allegb + allekb + alleziffern + allesonderzeichen;
Vorteil: Wenn du nun die 4 einzelnen Variablen (für Großbuchstaben, ...) anpasst änderst du die Variable alles auch gleich.
Leere catch-Blöcke vermeiden
 
Was sich mir jetzt nicht erschliesst ist warum dieser Fehler nur beim "Save" Fenster passiert aber beim "Speichern" Fenster nicht? Die beiden nutzen den selben FileReader code.

Das ich des Passwort fenster asugelagert habe liegt auch daran das mein Dozent gesagt hat man soll die Klassen so übersichtlich wie möglich halten. Und da Auf die Passwort daten mehrere Klassen zugreifen dachte ich ich mach das mal seperat.

Zum rest dank ich dir werds mir merken und anwenden. Vieles ist noch nicht optimiert da ich mich erst um die Funktunalität kümmern wollte. Danach wollte ich alles schick machen😀
 
Was sich mir jetzt nicht erschliesst ist warum dieser Fehler nur beim "Save" Fenster passiert aber beim "Speichern" Fenster nicht? Die beiden nutzen den selben FileReader code.

Es liegt ja nicht am FileReader Code, sondern daran das deine Klasse Passwort (warum auch immer) von generator ableitet!
Immer wenn du ein Objekt von Passwort erstellst wird ein Hauptfenster erzeugt. Beim "Speichern" Fenster schreibst du die Daten ja nur die Datei und erzeugst da keine neuen Passwort-Objekte.

Das ich des Passwort fenster asugelagert habe liegt auch daran das mein Dozent gesagt hat man soll die Klassen so übersichtlich wie möglich halten. Und da Auf die Passwort daten mehrere Klassen zugreifen dachte ich ich mach das mal seperat.

Damit hat dein Dozent recht, Klassen sollten so übersichtlich und einfach wie möglich gehalten werden.
Das du die Daten in einer eigenen Klasse kapselst ist schon in Ordnung. Fraglich ist aber warum diese Klasse von "generator" ableiten lässt, das macht überhaupt keinen Sinn 😉
Auch solltest du aufpassen wovon du redest (das sollte eindeutig sein) : Du schreibst du hast das "Passwort fenster" ausgelagert. Wen du damit die Klasse Passwort meinst -> welches Fenster? Das ist eine einfache Klasse zum halten von Daten 😉

Zum rest dank ich dir werds mir merken und anwenden. Vieles ist noch nicht optimiert da ich mich erst um die Funktunalität kümmern wollte. Danach wollte ich alles schick machen😀
Eines ist mir noch eingefallen: Klassen sind Baupläne für Objekte und sollten daher keine "Tätigkeit" als Name haben.
Im Falle von deinem Code solltest du die Namen deiner Klasse "Save" und "Speichern" überdenken -> SaveDialog wäre ein passenderer Name 😉

Wenn man sich von Anfang an schon an gewisse Sachen hält (und seien es nur eigene Richtlinien) hat man später weniger arbeit und der Code ist auch während der Entwicklung lesbarer 🙂
 
Omg, ich kann dir nicht mal sagen warum ich "Passwort" abgeleitet hab. Jetzt merk ich das das völliger Bullshit war. Dank dir vielmals.
 
Falls du mal auf ein ähnliches Problem stößt ...

Falls du eine IDE zum Entwickeln verwendest, kannst du im Konstruktor deines Hauptfensters einfach einen Breakpoint setzen und dann anhand vom Stacktrace (new Throwable.getStackTrace()) zurückverfolgen, von wo aus der Aufruf kam.
Entweder das oder aber - weil du ja schon weißt, dass das beim Anzeigen des Passwortfensters passiert - setzt du den Breakpoint auf die Zeile, wo das Passwortfenster generiert wird, und stepst das Ganze dann durch.
 

Zurück
Oben