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:

Joose

Top Contributor
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!
 

Brymax

Mitglied
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^^
 

Joose

Top Contributor
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.
 

Brymax

Mitglied
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();
 

Joose

Top Contributor
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
 

Brymax

Mitglied
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:D
 

Joose

Top Contributor
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:D
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 :)
 

Brymax

Mitglied
Omg, ich kann dir nicht mal sagen warum ich "Passwort" abgeleitet hab. Jetzt merk ich das das völliger Bullshit war. Dank dir vielmals.
 

Neumi5694

Top Contributor
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.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
Drachenbauer Hauptfenster erhält schmale Streifen rechts unt unten, wenn ich einen JDialog hinzufüge. AWT, Swing, JavaFX & SWT 19
J vom Dialogfenster ein Feld des Hauptfenster einlesen AWT, Swing, JavaFX & SWT 2
D Transparentes Hauptfenster Events AWT, Swing, JavaFX & SWT 1
S Hauptfenster soll geöffnet bleiben AWT, Swing, JavaFX & SWT 4
C In Hauptfenster Programm-Klassen implementieren AWT, Swing, JavaFX & SWT 9
N Label auf Hauptfenster manipulieren AWT, Swing, JavaFX & SWT 2
Dit_ Wenn viele NebenFenster zum Locationsetzen das HauptFenster brauchen AWT, Swing, JavaFX & SWT 2
T Alle Folgefenster sollen im Hauptfenster geöffnet werden AWT, Swing, JavaFX & SWT 3
X Applicationfenster im 2.-/Hauptfenster erstellen AWT, Swing, JavaFX & SWT 5
O Look And Feel greift nicht im Hauptfenster (JFrame)! AWT, Swing, JavaFX & SWT 11
R SWING: Modales Fenster - Hauptfenster aktualisieren AWT, Swing, JavaFX & SWT 11
A SWT Hauptfenster aktualisieren AWT, Swing, JavaFX & SWT 6
M Hauptfenster und alle Kinder schließen? AWT, Swing, JavaFX & SWT 7
G Swing Menü Hauptfenster AWT, Swing, JavaFX & SWT 14
T Gui öffnet nicht AWT, Swing, JavaFX & SWT 2
O showConfirmDialog öffnet sich nicht AWT, Swing, JavaFX & SWT 3
S JavaFX Scene öffnet sich nicht AWT, Swing, JavaFX & SWT 3
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
J *.jar öffnet PDF-Datei nicht AWT, Swing, JavaFX & SWT 35
T Frame öffnet nicht AWT, Swing, JavaFX & SWT 1
Tausendsassa Frame öffnet aber zeigt keinen Inhalt... AWT, Swing, JavaFX & SWT 10
K Java Button öffnet neues Fenster AWT, Swing, JavaFX & SWT 5
T JavaFX ControlsFX-Notification öffnet nicht wenn kein JavaFX-Fenster offen. AWT, Swing, JavaFX & SWT 1
A Swing JFrame öffnet nicht vollständig AWT, Swing, JavaFX & SWT 1
B Swing focusGained öffnet sich zwei mal AWT, Swing, JavaFX & SWT 3
W Swing JFrame Parent öffnet Child AWT, Swing, JavaFX & SWT 1
S JFileChooser öffnet den falschen Ordner AWT, Swing, JavaFX & SWT 4
Helgon JFileChooser öffnet sich 2x AWT, Swing, JavaFX & SWT 12
T neuer JFrame öffnet sich erst wenn Methode die dahinerliegt abgeschlossen ist. BUG? AWT, Swing, JavaFX & SWT 4
U Frame öffnet anderes Frame: Methode auslagern AWT, Swing, JavaFX & SWT 26
L 2 Monitore, Fenster öffnet sich im falschen Monitor AWT, Swing, JavaFX & SWT 3
J JFileChooser öffnet sich in manchen Fällen extrem langsam! AWT, Swing, JavaFX & SWT 12
D Aufgeführte jar-Datei, JDialog öffnet sich nicht AWT, Swing, JavaFX & SWT 13
B DateComboBox öffnet sich hinter JTextarea. AWT, Swing, JavaFX & SWT 10
G PrintJob öffnet sich auf manchen PCs nicht AWT, Swing, JavaFX & SWT 5
L F10 Taste öffnet das Menü AWT, Swing, JavaFX & SWT 7
M JComboBox Popup öffnet nicht AWT, Swing, JavaFX & SWT 6
J JList - doppelklick auf item -> neues fenster öffnet sich AWT, Swing, JavaFX & SWT 2
Juelin Javafx hängt sich auf AWT, Swing, JavaFX & SWT 31
I JavaFX Programmcode pausieren gestaltet sich als schwierig AWT, Swing, JavaFX & SWT 7
N Dropshadow setzen bei einer Gruppe von Tiles, die sich jeweils in einer Stackpane befinden, welche in einer Gridpane angeordnet sind. AWT, Swing, JavaFX & SWT 0
berserkerdq2 Skalieren sich javafx objekte automatisch auf die Bildschirmgröße AWT, Swing, JavaFX & SWT 6
B JavaFX Prüfen ob ein Objekt sich mehrmals in einer Liste befindet AWT, Swing, JavaFX & SWT 5
K Textarea aktuallisiert sich nicht, nach Auswahl (Itemlistener) AWT, Swing, JavaFX & SWT 3
S e(fx)clipse erscheint nicht im Marketplace, lässt sich nicht installieren AWT, Swing, JavaFX & SWT 16
A TableView updatet sich nicht AWT, Swing, JavaFX & SWT 3
M Wieso verändert sich die Framerate nach erneutem Starten des AnimationTimer? AWT, Swing, JavaFX & SWT 18
I AWT java.awt.FileDialog - "coffee cup"-Icon lässt sich nicht ersetzen AWT, Swing, JavaFX & SWT 14
J JOptionPane ruft sich selbst immer wieder neu auf AWT, Swing, JavaFX & SWT 3
P Swing Programm hängt sich bei Buttondruck auf? (GUI für "Chatbot" erstellen) AWT, Swing, JavaFX & SWT 15
T Swing JTable cellRenderer mit jpg Hintergrundfarbe lässt sich nicht ändern. AWT, Swing, JavaFX & SWT 1
R JOptionPane schließt sich nicht wieder AWT, Swing, JavaFX & SWT 2
R Textfield lässt sich nicht positionieren AWT, Swing, JavaFX & SWT 1
E Keystroke für Ausschneiden läßt sich nicht ändern AWT, Swing, JavaFX & SWT 2
B Dynamische ListView-Größe, die bei Fenstergrößenänderung sich anpasst AWT, Swing, JavaFX & SWT 19
sascha-sphw JavaFX ListCell höhe verändert sich beim ändern der Text-Farbe AWT, Swing, JavaFX & SWT 14
R Swing Komponente im JFrame überschreinen sich AWT, Swing, JavaFX & SWT 7
A Swing Datei lässt sich zwar speichern, aber nicht laden (Inhalt im JTextField anzeigen) AWT, Swing, JavaFX & SWT 18
K JavaFX Fenstergröße ändert sich (Gluon - SceneBuilder) AWT, Swing, JavaFX & SWT 23
C Bilder so einbinden, dass sie sich ändern AWT, Swing, JavaFX & SWT 6
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
J ChangeListener verhält sich komisch AWT, Swing, JavaFX & SWT 14
S Ausgabe aktualisiert sich nur nach 2. Klick AWT, Swing, JavaFX & SWT 17
Legi Swing JButton Icon verschiebt sich AWT, Swing, JavaFX & SWT 2
P Gui lässt sich nicht starten AWT, Swing, JavaFX & SWT 10
B JavaFX setOnMousePressed() - verhält sich wie setOnMouseClicked()? AWT, Swing, JavaFX & SWT 6
R JavaFX lässt sich nicht in Eclipse einbinden AWT, Swing, JavaFX & SWT 4
J BackgroundJPanel passt sich dem JFrame nicht an AWT, Swing, JavaFX & SWT 7
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
M 2D-Grafik Spielfigur bewegt sich nicht AWT, Swing, JavaFX & SWT 6
W Javafx - Image soll sich mit der Camera mitbewegen AWT, Swing, JavaFX & SWT 1
T .jar-Datei lässt sich unflexibler ausführen als über die IDE AWT, Swing, JavaFX & SWT 11
K JavFX: VBox.setVGrow stell sich quer AWT, Swing, JavaFX & SWT 2
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
S Swing Bedienelemente ordnen sich automatisch neu an AWT, Swing, JavaFX & SWT 2
K Mit JavaFX angefangen. Lohnt sich Swing? AWT, Swing, JavaFX & SWT 28
E Java FX ProgressIndicator dreht sich nicht AWT, Swing, JavaFX & SWT 8
P Swing JFrame minimiert sich bei Doppelklick auf die Titel-Leiste AWT, Swing, JavaFX & SWT 16
krgewb AWT JFrame soll sich wie Dialog verhalten AWT, Swing, JavaFX & SWT 9
D JavaFX Label lässt sich nicht mehrmals färben AWT, Swing, JavaFX & SWT 7
Prafy Sich ändernde Farbverläufe erstellen AWT, Swing, JavaFX & SWT 4
D JavaFX Anwendung hängt sich permanent auf AWT, Swing, JavaFX & SWT 6
T JButton überlagern sich und werden erst beim Mausscrollen sichtbar AWT, Swing, JavaFX & SWT 2
T Swing Programm hängt sich auf! AWT, Swing, JavaFX & SWT 23
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
J Button vergrößert sich bei Fenster resize AWT, Swing, JavaFX & SWT 22
J Lohnt sich FX? AWT, Swing, JavaFX & SWT 2
Tort-E JavaFX ProgressIndicator dreht sich nicht AWT, Swing, JavaFX & SWT 2
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5
N Programm mit Swing und Thread, Figur bewegen sich nicht AWT, Swing, JavaFX & SWT 6
Tom299 JavaFX Default-Cursor läßt sich nicht immer "aktivieren" AWT, Swing, JavaFX & SWT 3
B Frame hängt sich auf trotz invokeLater AWT, Swing, JavaFX & SWT 1
D Java Swing, Label lässt sich nicht mit Checkboxen/Knopf verändern AWT, Swing, JavaFX & SWT 2
J Server stellt sich hin AWT, Swing, JavaFX & SWT 13
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
L JButton flackern - Programm hängt sich auf AWT, Swing, JavaFX & SWT 3
H JTree in JScrollPane passt sich nicht an Größe von JPanel an AWT, Swing, JavaFX & SWT 2
J Programm hängt sich bei Log In auf AWT, Swing, JavaFX & SWT 1
M JFreeChart neu zeichnen sich Wenn Jtable sich ändert AWT, Swing, JavaFX & SWT 5
ToBJo JavaFX TreeView zerstört sich selbst AWT, Swing, JavaFX & SWT 1

Ähnliche Java Themen

Neue Themen


Oben