passwortabfrage im GUI

Status
Nicht offen für weitere Antworten.
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:

Java:
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
Java:
passwortok.addActionListener(new passwortokaction());

Java:
        class passwortokaction implements ActionListener

und bei

Java:
            public void actionPerformed (ActionEvent e)
,

da sagt er "cannot find symbol", und bei

Java:
            if (passwd == "chriss")

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

Schandro

Top Contributor
1. du musst du Klasse passwortokaction vor deren Aufruf definieren:
Java:
        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.
Code:
if (passwd.equals("abcd")){
 
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:
 
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

Bekanntes Mitglied
:)
kleiner Tipp noch zu dem JPasswordField: Werf mal einen Blick in die Dokumentation. Es gibt eine Methode
Code:
getPassword();
die solltest du statt
Code:
getText();
benutzen. Allerdings musst du da aufpassen da sie anstelle eines Strings ein char-Array zurück gibt.
 
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.

Java:
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

Top Contributor
char array, den ich vom passwortfeld eingelsen habe, mit ein paar chars vergleichen
meinst du z.b. sowas:
Code:
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^^
 
meinst du z.b. sowas:
Java:
passwd[0] == 'b'


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

Java:
 /*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).
 
Zuletzt bearbeitet:

Schandro

Top Contributor
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:
Java:
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
 
Zuletzt bearbeitet:

Landei

Top Contributor
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:
Java:
public boolean charArraysAreEqual(char[] a1, char[] a2){
   return java.util.Array.equals(a1, a2);
}
 
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:

Java:
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?
 
Zuletzt bearbeitet:
bekomms immer noch nicht hin, mein passwortfenster schließt sich, aber mein hauptfenster will sich nicht öffen. Hier nochmal mein code:

Java:
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:
 
Zuletzt bearbeitet:

Schandro

Top Contributor
Java:
            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.
 
G

Gonzo17

Gast
Außerdem noch ein kleiner Fehler hier:

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

Diese Zeilen sind gleichbedeutend mit:

Java:
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. ;)
Java:
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i]){
                    return false;
                    }
                }
 

Leroy42

Top Contributor
Außerdem noch ein kleiner Fehler hier:

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

LOL! :D
Eher ein Riesenfehler

Diese Zeilen sind gleichbedeutend mit:

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

Genau!

Also das Semikolon weg und geschweifte Klammern da hin. ;)

Das Semikolon zu entfernen würde schon reichen.
Java:
for (int i=0; i<a1.length; ++i){
                    if (a1[i] != a2[i])
                        return false;
                }
 

Leroy42

Top Contributor
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
Java:
begin
  a;
  b;
  c
end
anstatt
Java:
begin
  a;
  b;
  c;
end
 
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?
 
Zuletzt bearbeitet:
G

Gonzo17

Gast
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?


Edit: soll ich nochmal den code einstellen?

Ich denke das wäre nicht verkehrt. :)
 
ich will, dass er seine funktion ausführt

Passwortabfrage:
Java:
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
Java:
 /*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 */
 
G

Gonzo17

Gast
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:

Java:
		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) {
			}

		});
 
Zuletzt bearbeitet von einem Moderator:
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben