# passwortabfrage im GUI



## Kontraproduktiv (23. Aug 2009)

tag miteinander,

Nachdem ich heute in meinem Tutorial zur programmierung von GUIs mittels der swing library gekommen bin, wollte ich den gelernten Stoff anwenden und eine paswortabfrage programmieren (das kam noch nicht vor, und ich weiss nicht obs noch vorkommen wird, hab aber im internet JPasswordField gefunden). Der Anfang ging prima (so wars auch beschrieben) aber bei der passwortabfrage will der compiler dann nicht ganz so wie ich es will:


```
package projekt1;
import javax.swing.*;


public class Main {

    public static void main(String[] args) {
        /*Passwortabfrage*/
        final JFrame passwort = new JFrame("Passwort");
        passwort.setVisible(true);
        passwort.setSize(200, 80);
        passwort.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        final JPasswordField pass = new JPasswordField(6);
        pass.setEchoChar('#');
        JPanel passwortpanel = new JPanel();
        passwort.add(passwortpanel);
        passwortpanel.add(pass);
        JButton passwortok = new JButton("weiter");
        passwortpanel.add(passwortok);
        
        final JFrame Frame = new JFrame("Haupfenster");
        Frame.setVisible(false);
        Frame.setSize(500, 500);
        Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        passwortok.addActionListener(new passwortokaction());

        
        
        class passwortokaction implements ActionListener
        {
            String passwd = new String (pass.getText());     
            public void actionPerformed (ActionEvent e)
            {
            if (passwd == "abcd"){
                passwort.setVisible(false);
                Frame.setVisible(true);
            } 
            else{
                System.exit(0);
            }
            }

        }

    
    
    }
}
```

ich rufe praktisch ein fenster auf, wo ich dann eine eingabe mache (soweit funktioniert es auch prima), und wenn die eingabe richtig war, soll sich dieses fenster schließen und sich ein neues aufmachen. Hapern tuts bei 

```
passwortok.addActionListener(new passwortokaction());
```


```
class passwortokaction implements ActionListener
```

und bei 


```
public void actionPerformed (ActionEvent e)
```
,

da sagt er "cannot find symbol", und bei 


```
if (passwd == "chriss")
```

da sagt er ich solle strings mit == oder != vergleichen, obwohl ich das doch tu:bahnhof:


----------



## Schandro (23. Aug 2009)

1. du musst du Klasse passwortokaction vor deren Aufruf definieren:

```
class passwortokaction implements ActionListener
        {
            String passwd = new String (pass.getText());
            public void actionPerformed (ActionEvent e)
            {
            if (passwd == "abcd"){
                passwort.setVisible(false);
                Frame.setVisible(true);
            }
            else{
                System.exit(0);
            }
            }

        }
        passwortok.addActionListener(new passwortokaction());
```
2. Strings vergleicht man mit equals. Falls deine IDE tatsächlich was anderes behauptet ist das ein Bug.

```
if (passwd.equals("abcd")){
```


----------



## Marco13 (23. Aug 2009)

Schandro hat gesagt.:


> 2. Strings vergleicht man mit equals. Falls deine IDE tatsächlich was anderes behauptet ist das ein Bug.


Ich tippe eher auf einen Übersetzungs- oder Interpretationsfehler


----------



## Kontraproduktiv (23. Aug 2009)

vielen dank schonmal, erstmal brauch ich etwas schlaf, dann werde ich das korrigieren. Aber schön zu wissen das einem hier um 2 uhr morgens noch geholfen wir:applaus:


----------



## Kontraproduktiv (23. Aug 2009)

Hmm, bei mir werden immer noch die Wörter ActionEvent, ActionListener und (new passwortokaction()) unterstrichen. Bei den ersten beiden wörtern meint er immer noch das symbol nicht finden zu können, und bei (new passwortokaction()) sagt er : method addActionListener in class javax.swing.AbstractButton cannot be applied to given types

jemand ne idee?


----------



## Paddelpirat (23. Aug 2009)

hi,

probier es mal mit: import java.awt.event.*;


----------



## Kontraproduktiv (23. Aug 2009)

danke das wars^^. Manchmal sieht man den wald vor lauter bäumen nicht mehr


----------



## Paddelpirat (23. Aug 2009)

kleiner Tipp noch zu dem JPasswordField: Werf mal einen Blick in die Dokumentation. Es gibt eine Methode 
	
	
	
	





```
getPassword();
```
 die solltest du statt 
	
	
	
	





```
getText();
```
 benutzen. Allerdings musst du da aufpassen da sie anstelle eines Strings ein char-Array zurück gibt.


----------



## jobu0101 (23. Aug 2009)

Ich würde Klassennamen groß schrieben...


----------



## Kontraproduktiv (23. Aug 2009)

hab mir mal die dokumentation dazu durchgelesen. dort ist das ganze etwas komplizierter als bei mir : Dadurch das ich getText durch getPassword ersetzt habe, bekomme ich das passwort jetzt in einem char array.


```
char[] passwd = pass.getPassword();
```

wenn ich jetzt aber passwd mit dem richtigen passwort vergleichen will, kann ich ja kein equal mehr benutzen. In der Doku haben die das so gelöst das die ne neue methode geschrieben haben, in der das richtige passwort in einem neuen char array gespeichert wird und dann diese beiden arrays (indirekt) verglichen wurden. Meine frage ist nun, muss ich zwingend diesen weg über eine neue methode gehen, oder kann ich nicht einfach den char array, den ich vom passwortfeld eingelsen habe, mit ein paar chars vergleichen (habs schon versucht, bekomm aber die unterschiedlichsten fehlermeldungen)?


----------



## Schandro (23. Aug 2009)

> char array, den ich vom passwortfeld eingelsen habe, mit ein paar chars vergleichen


meinst du z.b. sowas:

```
passwd[0] == 'b'
```
? Klar, kannst du machen wenn es in deinen Programm Sinn macht und du auf die Array Größe Acht gibst...

Ansonsten:
Was soll an einer kleinen Schleife die die beiden char-Arrays vergleicht umständlich sein? Das sind maximal 5 Zeilen + methodenkopf^^


----------



## Kontraproduktiv (23. Aug 2009)

> meinst du z.b. sowas:
> 
> ```
> passwd[0] == 'b'
> ```




wenn ich sowas mache, überschreibe ich dann nicht das, was in meinem passwortfeld steht? ich habe es jetzt so versucht:


```
/*Paswortabfrage Button-action*/
        class passwortokaction implements ActionListener
        {
            char[] passwd = pass.getPassword();
            char[] richtigespasswd = {'a','b','c','d'};
            public void actionPerformed (ActionEvent e)
            {
            if (passwd == richtigespasswd){
                passwort.setVisible(false);
                Frame.setVisible(true);
            }
            else{
                System.exit(0);
            }
            }
```

mein ziel ist es, das was ich eingelesen habe von meinem Passwortfeld (passwd), zu vergleichen mit meinem richtigen passwort (richtigespasswd), und wenn beide identisch sind, soll sich das passwortfenster schließen (passwort.setVisible(false); Frame.setVisible(true); ) und mein hauptfenster soll sich öffnen. Der code oben ergibt zwar keine compilierfehler oder dergleichen, ich kann jedoch eingeben was ich will, das passwortfenster schließt sich immer und beendet das gesammte programm^^. Ich glaube ich mache immer noch etwas bei dem vergleich falsch (jedoch hatte ich das gleiche problem auch, als ich strings verglichen hatte).


----------



## Schandro (23. Aug 2009)

genau wie beim String vergleich kann man hier auch nicht mit == arbeiten. Schließlich sind es immer 2 unterschiedliche Arrays, obwohl manchmal das gleiche drinsteht...
Mach dir ne util-Methode:

```
public boolean charArraysAreEqual(char[] a1, char[] a2){
	if(a1.length != a2.length){
		return false;
	}
	
	for(int i=0;i<a1.length;++i){
		if(a[i] != a[2]){ // hier kann man mit == bzw. != arbeiten, da char's primitive Datentypen sind
			return false;
		}
	}
	return true;
}
```
(kann sein das Syntaxfehler drin sind, habs im Browser geschrieben)
Das könnt man zwar mit Generics viel schöner lösen, wär aber viel zu umständlich und unnötig fürn Anfänger.

PS: Falls du meine Methode nicht magst kannst du auch diese bereits existierende Methode benutzen:
java.util.Arrays#equals


----------



## Landei (24. Aug 2009)

Aber Loite!!!1!

Java-Arrays sind zwar doof wie Bohnenstroh, aber per Hand vergleichen muss man trotzdem nicht. java.util.Arrays hat so schöne Methoden wie equals, toString, hashCode, deepEquals, deepToString, deepHashCode, sort, binarySearch und fill, warum nimmt die keiner?

Das reduziert den Code auf:

```
public boolean charArraysAreEqual(char[] a1, char[] a2){
   return java.util.Array.equals(a1, a2);
}
```


----------



## Schandro (24. Aug 2009)

> Das reduziert den Code auf: ...


siehe den unteren Teil meines Posts.


----------



## Kontraproduktiv (24. Aug 2009)

vielen dank, ich werde shandros version benutzen, weil ich ja lernen will sowas geht, und eine vorgegebene methode ist villeicht komfortabler, lernen tu ich daraus aber nichts. Aber trotzdem danke

@Schandro

muss es in deinem Code nicht heißen:


```
public boolean ArrysVergleichen (char[] a1, char[] a2){
                if (a1.length != a2.length){
                    return false;
                }
                for (int i=0; i<a1.length; ++i){
                    if (a1[i] != [B]a2[i][/B]);
                    return false;
                }
            return true;
            }
```


weil ich will ja nicht jeden buchstaben von meinem richtigen passwort mit dem 2. Buchstaben das eingegebenen passworts vergleichen, oder habe ich da was falsch verstanden?


----------



## faetzminator (24. Aug 2009)

Genau, da hat sich wohl ein Fehlerlein eingeschlichen


----------



## Kontraproduktiv (24. Aug 2009)

bekomms immer noch nicht hin, mein passwortfenster schließt sich, aber mein hauptfenster will sich nicht öffen. Hier nochmal mein code:


```
package projekt1;
import javax.swing.*;
import java.awt.event.*;

public class Main {

    public static void main(String[] args) {
        /*Passwortabfrage*/
        final JFrame passwort = new JFrame("Passwort");
        passwort.setVisible(true);
        passwort.setSize(200, 80);
        passwort.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel passwortpanel = new JPanel();
        final JPasswordField pass = new JPasswordField(4);
        pass.setEchoChar('*');
        passwort.add(passwortpanel);
        passwortpanel.add(pass);
        JButton passwortok = new JButton("weiter");
        passwortpanel.add(passwortok);
        /*Passwortabfrage ende*/
        
        /*Hauptfenster*/
        final JFrame Frame = new JFrame("Haupfenster");
        Frame.setVisible(false);
        Frame.setSize(500, 500);
        Frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        /*Hauptfenster ende*/
        


        /*Paswortabfrage Button-action*/
        class passwortokaction implements ActionListener
        {
            char[] passwd = pass.getPassword();
            char[] richtigespasswd = {'a','b','c','d'};
            public void actionPerformed (ActionEvent e)
            {
            if (ArraysVergleichen(richtigespasswd, passwd)){
                passwort.setVisible(false);
                Frame.setVisible(true);
            }
            else{
                System.exit(0);
            }
            }
            /*Passwörter vergleichen*/
            public boolean ArraysVergleichen (char[] a1, char[] a2){
                if (a1.length != a2.length){
                    return false;
                }
                for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i]);
                    return false;
                }
            return true;
            }
            /* Passwörter verlgeichen ende*/
        }
        passwortok.addActionListener(new passwortokaction());
            /*Passwortabfrage Button-action ende */

    }
}
```

mache ich villeicht etwas anderes falsch?

edit:// wo aktiviere ich in netbeans die reihenzahlen? So das ich neben meinem code die reihenzahl sehe? Ich finds einfach nicht???:L
edit2:// links neben dem code rechtsklick auf den grauen balken und show line numbers aktivieren:bae:


----------



## Schandro (24. Aug 2009)

```
char[] passwd = pass.getPassword();
            char[] richtigespasswd = {'a','b','c','d'};
```
Diese beiden Sachen werden ausgeführt, wenn die Instanz von passwortokaction erstellt wird. Zu der Zeit steht in pass logierscherweise noch nichts. Du musst innerhalb der actionPerformed Methode das aktuell eingetippte Password abfragen.


----------



## Gonzo17 (24. Aug 2009)

Außerdem noch ein kleiner Fehler hier: 


```
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i]);
                    return false;
                }
```

Diese Zeilen sind gleichbedeutend mit:


```
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i])
                    ;
                    return false;
                }
```

Und das wiederrum würde ja bedeuten, dass, wenn die if-Bedingung erfüllt wird, nichts passiert und nach jeder if-Abfrage der boolean-Wert false zurückgegeben wird. Also das Semikolon weg und geschweifte Klammern da hin. 

```
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i]){
                    return false;
                    }
                }
```


----------



## Kontraproduktiv (24. Aug 2009)

jungs, ihr habts drauf:applaus:


----------



## Leroy42 (24. Aug 2009)

Gonzo17 hat gesagt.:


> Außerdem noch ein kleiner Fehler hier:
> 
> 
> ```
> ...



LOL! 
Eher ein *Riesen*fehler



Gonzo17 hat gesagt.:


> Diese Zeilen sind gleichbedeutend mit:
> 
> 
> ```
> ...



Genau!



Gonzo17 hat gesagt.:


> Also das Semikolon weg und geschweifte Klammern da hin.



Das Semikolon zu entfernen würde schon reichen.

```
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i])
                        return false;
                }
```


----------



## Gonzo17 (24. Aug 2009)

Leroy42 hat gesagt.:


> Das Semikolon zu entfernen würde schon reichen.



Ich weiss, da hast du auch Recht.  Ich tu das nur der Übersicht wegen bei jedem if-Statement so, dass ich die geschweiften Klammern setze, daher hab ichs jetzt auch "automatisch" getan.


----------



## Leroy42 (24. Aug 2009)

Gonzo17 hat gesagt.:


> Ich tu das nur der Übersicht wegen bei jedem if-Statement so, dass ich die geschweiften Klammern setze, daher hab ichs jetzt auch "automatisch" getan.



Da hast du Recht und auch viele andere setzen immer geschweifte Klammern.

Aber diesbezüglich bin ich ein hoffnungsloser Mimalist:

Wozu unnötige Block-Anweisungen in den Code einstreuen? :bae: oops

Aus dem gleichen Grund hab' ich damals auch auf das überflüssige
Semikolon nach der letzten Anweisung in einem Pascal-Block verzichtet

Also

```
begin
  a;
  b;
  c
end
```
anstatt

```
begin
  a;
  b;
  c;
end
```


----------



## Kontraproduktiv (25. Aug 2009)

tag, ich nochmal^^

und zwar wollte ich jetzt zu dem Button neben dem passwortfeld die Funktion Hinzufügen, durch drücken der Enter-Taste aktiviert zu werden (passwortok.setMnemonic(KeyEvent.VK_ENTER); ). Nun kann ich aber auf die Entertaste Dreschen bis ich blau werde, der button bleibt deaktiviert. Der compiler zeigt auch keine warning bzw. errors an...

Edit: soll ich nochmal den code einstellen?


----------



## Gonzo17 (26. Aug 2009)

Kontraproduktiv hat gesagt.:


> und zwar wollte ich jetzt zu dem Button neben dem passwortfeld die Funktion Hinzufügen, durch drücken der Enter-Taste aktiviert zu werden (passwortok.setMnemonic(KeyEvent.VK_ENTER); ). Nun kann ich aber auf die Entertaste Dreschen bis ich blau werde, der button bleibt deaktiviert. Der compiler zeigt auch keine warning bzw. errors an...



Hm, jetzt mal so zum Verständnis. Willst du, dass per Tastendruck auf Enter der Button aktiviert wird (also enabled auf true setzen) oder willst du, dass da der Button seine Funktion ausführt?




Kontraproduktiv hat gesagt.:


> Edit: soll ich nochmal den code einstellen?



Ich denke das wäre nicht verkehrt.


----------



## Kontraproduktiv (26. Aug 2009)

ich will, dass er seine funktion ausführt

Passwortabfrage:

```
public class Main {

    public static void main(String[] args){

    /*Passwortabfrage*/
        final JFrame passwort = new JFrame("Passwort");
        passwort.setVisible(true);
        passwort.setSize(210, 80);
        passwort.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        JPanel passwortpanel = new JPanel();
        final JPasswordField pass = new JPasswordField(4);
        pass.setEchoChar('*');
        passwort.add(passwortpanel);
        passwortpanel.add(pass);
        JButton passwortok = new JButton("weiter");
        passwortok.setMnemonic(KeyEvent.VK_ENTER);
        passwortpanel.add(passwortok);
        /*Passwortabfrage ende*/
```

Funktion des Buttons

```
/*Paswortabfrage Button-action*/
        class passwortokaction implements ActionListener
        {
            char[] richtigespasswd = {'a','b','c','d'};
            public void actionPerformed (ActionEvent e)
            {
            char[] passwd = pass.getPassword();

                if (ArraysVergleichen(richtigespasswd, passwd)){
                passwort.setVisible(false);
                Frame.setVisible(true);
            }
            else{
                passwort.setVisible(false);
                JFrame falschespw = new JFrame ("falsches Passwort");
                falschespw.setVisible(true);
                falschespw.setSize(300,100);
                falschespw.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                JPanel falschespwpanel = new JPanel();
                falschespw.add(falschespwpanel);
                JLabel falschespwlabel= new JLabel("Sie haben ein falsches Passwort eingegeben");
                falschespwpanel.add(falschespwlabel);
                JButton falschespwclose = new JButton ("Schließen");
                falschespwpanel.add(falschespwclose);

                class falschespwcloseaction implements ActionListener{

                public void actionPerformed (ActionEvent e){
                    System.exit(0);
                }
                }
                falschespwclose.addActionListener(new falschespwcloseaction());
                            passwortok.addActionListener(new passwortokaction());
    /*Passwortabfrage Button-action ende */
```


----------



## Gonzo17 (26. Aug 2009)

setMnemonic ist denke ich nicht das, was du suchst. Es funktioniert schon, aber du hast das wohl falsch verstanden. Starte mal dein Programm und drücke ALT + ENTER. 
Also wie du siehst ist setMnemonic für Shortcuts gedacht.

Spontan fällt mir nur ein, dass du einen KeyListener verwenden könntest. Das wäre nur das Problem, dass dieser nur reagiert, wenn der Button fokusiert ist. Andererseits könntest du natürlich einen KeyListener auf dein gesamtes Frame legen, dann reagiert er immer, wenn du ne Taste drückst. Dann musst du nur ne Abfrage machen, ob es die gewollte Taste ist und wenn ja, dann den Button ausführen lassen.

Edit sagt: Das hier müsste funktionieren:


```
passwort.addKeyListener(new KeyListener() {

			@Override
			public void keyPressed(KeyEvent e) {
			}

			@Override
			public void keyReleased(KeyEvent e) {
				if (e.getKeyCode() == KeyEvent.VK_ENTER)
					passwortok.doClick();
			}

			@Override
			public void keyTyped(KeyEvent e) {
			}

		});
```


----------



## Kontraproduktiv (26. Aug 2009)

Achso, viele dank:toll:


----------

