Swing Auf Knopfdruck ein Fenster schliessen

Fl0r1an

Mitglied
Hallo erstmal!
Ich bin zur Zeit noch Schüler. Zur Zeit beschäftigen wir uns in unserem Informatik Kurs mit der Programmiersprache Java.
Ich habe nun (freiwillig 😀 , da ich spaß am programmieren gefunden habe) angefangen mir ein Programm zu schreiben, welches meine Login-Daten (z.Bsp. von Email Adressen, Foren, Spielen etc.) speichern soll. Ja, ich weis, das kann man auch mit seinem Browser machen, aber ich möchte diese lokal auf meinem Computer (warscheinlich als SQL-Datenbank) speichern.
Im Moment habe ich meine Login-Daten noch in leider wenig unsicheren .txt - Dateien gespeichert.

Nun habe ich damit angefangen, mit Swing einen Login-Bildschirm zu schreiben, wo man sich zuerst mit einer Art 'Master-Kennwort' anmelden muss, um dann Zugriff auf die ganzen Login-Daten zu erhalten.
Das Fenster ist auch soweit fertig und funktioniert, jedoch gibt es noch eine Sache, die nicht funktioniert:
Ich möchte, wenn ich mich erfolgreich angemeldet habe, dass das Login-Fenster geschlossen wird, und sich das eigentliche Fenster mit den Daten öffnet. Wie sich das neue Fenster öffnen lässt ist mir bekannt, jedoch würde mich jetzt noch interessieren, mit welchem Befehl ich das Swing-Fenster über einen normalen JButton (bei mir JButton1) schliessen kann.

Die Passwörter verschlüssel ich später auch noch usw. aber jetzt würde ich gerne erstmal das oben genannte wissen. 🙂

VIELEN DANK schon im Vorraus!

Quelltext:
Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

public class Anmelden extends JFrame
{
    // Variablen Deklaration
    private JLabel jLabel1;
    private JLabel jLabel2;
    private JTextField jText1;
    private JPasswordField jPW1;
    private JButton jButton1;
    private JPanel contentPane;

    // Konstruktor
    public Anmelden()
    {
        super();
        erstellen();
        this.setVisible(true);
    }

    // Dienste
    private void erstellen()
    {
        jLabel1 = new JLabel();
        jLabel2 = new JLabel();
        jText1 = new JTextField();
        jPW1 = new JPasswordField();
        jButton1 = new JButton();
        contentPane = (JPanel)this.getContentPane();
        
        //jLabel1
        jLabel1.setHorizontalAlignment(SwingConstants.LEFT);
        jLabel1.setForeground(new Color(0, 0, 255));
        jLabel1.setText("Benutzername:");
        
        //jLabel2
        jLabel2.setHorizontalAlignment(SwingConstants.LEFT);
        jLabel2.setForeground(new Color(0, 0, 255));
        jLabel2.setText("Passwort:");
        
        //jText1
        jText1.setForeground(new Color(0, 0, 255));
        jText1.setSelectedTextColor(new Color(0, 0, 255));
        jText1.setToolTipText("Benutzername eingeben");
        jText1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                jText1_actionPerformed(e);
            }
        }
        );
        
        //jPW1
        jPW1.setForeground(new Color(0, 0, 255));
        jPW1.setToolTipText("Passwort eingeben");
        jPW1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                jPW1_actionPerformed(e);
            }
        }
        );
        
        //jButton1
        jButton1.setBackground(new Color(204, 204, 204));
        jButton1.setForeground(new Color(0, 0, 255));
        jButton1.setText("Anmelden");
        jButton1.addActionListener(new ActionListener()
        {
            public void actionPerformed(ActionEvent e)
            {
                jButton1_actionPerformed(e);
            }
        }
        );
        
        //contentPane
        contentPane.setLayout(null);
        contentPane.setBorder(BorderFactory.createEtchedBorder());
        contentPane.setBackground(new Color(204, 204, 204));
        addComponent(contentPane, jLabel1, 5,10,106,18);
        addComponent(contentPane, jLabel2, 5,47,97,18);
        addComponent(contentPane, jText1, 110,10,183,22);
        addComponent(contentPane, jPW1, 110,45,183,22);
        addComponent(contentPane, jButton1, 150,75,100,28);
        
        //login
        this.setTitle("Anmelden | passwortManager version 1.0");
        this.setLocation(new Point(76, 182));
        this.setSize(new Dimension(500, 141));
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setResizable(false);
    }
    
    /** Inhalt ohne LayoutManager hinzufügen (Absolute Positionierung) */
    private void addComponent(Container container,Component c,int x,int y,int breite,int höhe)
    {
        c.setBounds(x,y,breite,höhe);
        container.add(c);
    }
    
    private void jText1_actionPerformed(ActionEvent e)
    {
        
    }
    
    private void jPW1_actionPerformed(ActionEvent e)
    {
        
    }
    
    private void jButton1_actionPerformed(ActionEvent e)
    {
        boolean checker = false;
        System.out.println("jButton_actionPerformed(ActionEvent e) meldet sich zu Wort. Bitte bearbeiten! :D"); /** ENTFERNEN */
        String username = new String(jText1.getText());
        String passwort = new String(jPW1.getText());
        
        if(username.equals("") || passwort.equals("")) //Wenn kein name oder PW eingegeben, tue folgendes:
        {
            checker = false;
            jButton1.setEnabled(false);
            JLabel errorFields = new JLabel("Anmeldung fehlerhaft! Du musst einen Benutzernamen und ein Kennwort eingeben!");
            JOptionPane.showMessageDialog(null,errorFields);
            jText1.setText("");
            jPW1.setText("");
            jButton1.setEnabled(true);
            this.setVisible(true);
        }
        else if(username.equals("admin") && passwort.equals("test123"))  //Wenn name=admin und pw=test123 tue das:
        {
            checker = true;
            jButton1.setEnabled(false);
            JLabel errorFields = new JLabel("Anmeldung erfolgreich! :)");
            JOptionPane.showMessageDialog(null,errorFields);
            //Platzhalter passwortManager öffnen!
        }
        else  //wenn Falsch tue das:
        {
            checker = false;
            jButton1.setEnabled(false);
            JLabel errorFields = new JLabel("Anmeldung fehlerhaft! Falsches Passwort!");
            JOptionPane.showMessageDialog(null,errorFields);
            jText1.setText("");
            jPW1.setText("");
            jButton1.setEnabled(true);
            this.setVisible(true);
        }
    }
    
    public static void main(String[] args)
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (Exception ex)
        {
            System.out.println("Look and Feel konnte nicht geladen werden. :(");
            System.out.println(ex);
        }
        new Anmelden();
    }
}
 
Du kannst

this.dispose();

oder

System.exit(0);

verwenden.

Hat aber weit ausgeholt für so eine kleine Frage. 😉 Na vermutlich kommen ja noch mehr. Bis Dienstag!
 
Soweit ich weiß, sollte man bei einem PasswordField nicht
Code:
.getText()
anwenden, sondern
Code:
.getPassword()

Code:
System.exit()
würde ich auch nicht benutzen, sondern
Code:
dispose()
 
Hat aber weit ausgeholt für so eine kleine Frage. 😉 Na vermutlich kommen ja noch mehr. Bis Dienstag!

Das sehen Sie richtig! 😀
Ich hatte ganz vergessen, das ich ja noch in der gleichen Klasse bin, und da ma eben flott this. nehmen kann 🙂
Danke für den command 🙂

P.S.: Ich denke auch das da noch mehr Fragen kommen werden... 😵

EDIT: Oh, das sind ja Sie Herr *u*d*b*r*... Fällt mir jetzt erst auf :lol:

Soweit ich weiß, sollte man bei einem PasswordField nicht
Code:
.getText()
anwenden, sondern
Code:
.getPassword()

Achso, deswegen gibt mir mein Editor (BlueJ) immer eine Fehlermeldung... 😀
DANKE!!!

Wenn ich ne neue Frage hab, soll ich dann lieber nen neuen Thread machen? Oder hier drunter dann.. ?!
 
Zuletzt bearbeitet von einem Moderator:
Java:
addComponent(contentPane, jLabel1, 5,10,106,18);
        addComponent(contentPane, jLabel2, 5,47,97,18);
        addComponent(contentPane, jText1, 110,10,183,22);
        addComponent(contentPane, jPW1, 110,45,183,22);
        addComponent(contentPane, jButton1, 150,75,100,28);
Erklär mir mal wie du auf die Zahlen gekommen bist. Und dann guck der den Link in meiner Signatur an, null layout is evil.
 
Und dann probierst du es auf jeden Betriebsystem mit jeder möglichen Konfiguration aus? 😀
Für Login wäre warscheinlich

Code:
Borderlayout
----------------------
| Gridlayout (Center)|
| FlowLayout (South) |
----------------------

gut geeignet.
 
Zuletzt bearbeitet:
Code:
Borderlayout
----------------------
| Gridlayout (Center)  |
| FlowLayout (South) |
----------------------

Verstehe ich richtig, dass da jetzt 3 verschiedene LayoutManager genutzt wurden? :bahnhof:
Wie kann man denn mehr als 1 LayoutManager benutzen? Soweit bin ich noch nicht... 🙁

Kann mir einer da vllt ein kurzes Code-Beispiel für geben oder das kurz erklären?
 
Java:
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.awt.Point;
import java.awt.event.ActionEvent;
import java.util.Arrays;

import javax.swing.AbstractAction;
import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;
import javax.swing.UIManager;
import javax.swing.WindowConstants;
 
public class Anmelden extends JFrame
{
	private JTextField usernameField;
	private JPasswordField passwordField;
	private JButton loginButton;
	
	// Konstruktor
    public Anmelden()
    {
        super();
        erstellen();
        this.setVisible(true);
    }
 
    // Dienste
    private void erstellen()
    {        
        JPanel loginDataPanel = new JPanel(new GridLayout(2, 2));
        add(loginDataPanel, BorderLayout.CENTER);
        
        JLabel usernameTextLabel = new JLabel("Benutzername:");
        usernameTextLabel.setForeground(new Color(0, 0, 255));
        usernameTextLabel.setText("Benutzername:");
        loginDataPanel.add(usernameTextLabel);
                
        usernameField = new JTextField();
        usernameField.setForeground(new Color(0, 0, 255));
        usernameField.setToolTipText("Benutzername eingeben");
        loginDataPanel.add(usernameField);
       
        JLabel passwordTextLabel = new JLabel("Passwort:");
        passwordTextLabel.setForeground(new Color(0, 0, 255));
        loginDataPanel.add(passwordTextLabel);
        
        passwordField = new JPasswordField();
        passwordField.setForeground(new Color(0, 0, 255));
        passwordField.setToolTipText("Passwort eingeben");
        loginDataPanel.add(passwordField);
        
        JPanel buttonPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        add(buttonPanel, BorderLayout.SOUTH);
        
        loginButton = new JButton(new AbstractAction("Anmelden") {
			public void actionPerformed(ActionEvent e) {
				jButton1_actionPerformed(e);
			}
		});
        loginButton.setBackground(new Color(204, 204, 204));
        loginButton.setForeground(new Color(0, 0, 255));
        buttonPanel.add(loginButton);
        
        this.setTitle("Anmelden | passwortManager version 1.0");
        this.setLocation(new Point(76, 182));
        this.setSize(new Dimension(500, 141));
        this.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        this.setResizable(false);
    }
    
    private void jButton1_actionPerformed(ActionEvent e)
    {
        boolean checker = false;
        System.out.println("jButton_actionPerformed(ActionEvent e) meldet sich zu Wort. Bitte bearbeiten! :D"); /** ENTFERNEN */
        String username = usernameField.getText();
        char[] passwort = passwordField.getPassword(); //<- Passwörter NICHT als String verwenden. Char-Array verwenden und nach Benutzung Felder überschreiben.
        
        try {
        	if(username.equals("") || passwort.equals("")) //Wenn kein name oder PW eingegeben, tue folgendes:
            {
                checker = false;
                loginButton.setEnabled(false);
                JLabel errorFields = new JLabel("Anmeldung fehlerhaft! Du musst einen Benutzernamen und ein Kennwort eingeben!");
                JOptionPane.showMessageDialog(null,errorFields);
                usernameField.setText("");
                passwordField.setText("");
                loginButton.setEnabled(true);
                this.setVisible(true);
            }
            else if(username.equals("admin") && Arrays.equals(passwort, new char[] {
            		't', 'e', 's', 't', '1', '2', '3'
            }))  //Wenn name=admin und pw=test123 tue das:
            {
                checker = true;
                loginButton.setEnabled(false);
                JLabel errorFields = new JLabel("Anmeldung erfolgreich! :)");
                JOptionPane.showMessageDialog(null,errorFields);
                //Platzhalter passwortManager öffnen!
            }
            else  //wenn Falsch tue das:
            {
                checker = false;
                loginButton.setEnabled(false);
                JLabel errorFields = new JLabel("Anmeldung fehlerhaft! Falsches Passwort!");
                JOptionPane.showMessageDialog(null,errorFields);
                usernameField.setText("");
                passwordField.setText("");
                loginButton.setEnabled(true);
                this.setVisible(true);
            }	
        } finally {
        	for(int i = 0, size = passwort.length; i < size; i++) {
        		passwort[i] = 0;
        	}
        }
    }
    
    public static void main(String[] args)
    {
        JFrame.setDefaultLookAndFeelDecorated(true);
        JDialog.setDefaultLookAndFeelDecorated(true);
        try
        {
            UIManager.setLookAndFeel("com.sun.java.swing.plaf.windows.WindowsLookAndFeel");
        }
        catch (Exception ex)
        {
            System.out.println("Look and Feel konnte nicht geladen werden. :(");
            System.out.println(ex);
        }
        new Anmelden();
    }
}
 
haha, da wird sich mein Lehrer aber freuen, das andre die Arbeit für mich übernehmen.
ABER: D-A-N-K-E !! 😀

Jetzt muss ich es nur noch verstehen, aber das mach ich morgen^^

P.S.: Wieso hast du denn die ganzen Sachen alle einzeln importiert? Hat das Performance Einflüsse oder aus welchem Grund?
 
haha, da wird sich mein Lehrer aber freuen, das andre die Arbeit für mich übernehmen.
Das bezeifel ich. ^^ Aber hab ich ja nicht. Ich habe nur mal den fertigen Source durchgeschaut und angepasst, wie ich es finde, dass es besser wäre. Viele Dinge sind aber auch Geschmackabhängig.

P.S.: Wieso hast du denn die ganzen Sachen alle einzeln importiert? Hat das Performance Einflüsse oder aus welchem Grund?
Nö, das war Eclipse.
 
Wieso muss ich denn
Java:
 java.awt.event.*
einzeln importieren, wenn ich vorher schon
Java:
 java.awt.*
importiert habe?
Das mit event ist doch bei
Java:
 java.awt.*
enthalten, oder nicht?!
Mein Editor gibt mir immer ne Fehlermeldung, das er 'Action Event e' dann nicht erkennt...
 

Neue Themen


Zurück
Oben