Zufallszahlen und Frames

Status
Nicht offen für weitere Antworten.

Fabi

Mitglied
Hi,
zuerteinmal guten abend. ich bin neu hier im forum, und hoffe das mir hier geholfen werden kann.

ich habe folgendes Problem, und zwar bastle ich gerade an einem prgramm, das einen WPA2 Schlüssel für WLAN verbindungen generiert. Der Schlüssel ist 63 Zeichen lang und besteht aus allen Zeichen des Alphabets, allen Ziffern und diversen Sonderzeichen.

Das Prgramm ist eine reine Übung, die meiner Meinung nach sogar noch eine tolle funktion hat:).

Nun zu meinem Problem, ich habe das selbe Programm schon in C++ geschrieben, damals aber ohne GUI, sondern nur als CLI Tool, CLI deshalb, da es möglichst Plattformunabhängig sein sollte.
Für Java habe ich mir nun aber eine GUI gebastelet, da dies der eigentliche Übungszweck des Programms sein soll.

Ich gehe Folgendermaßen vor, ich habe ein Fenster mit zwei Buttons, einer zum beenden des Prgramms und einen zu generieren des WPA Schlüssels. Dieser Schlüssel soll nach dem er genriert wurde in ein Textfeld geschrieben werden.

Der Schlüssel wird folgendermaßen generiert. ich habe ein array in dem alle zeuchen die in einem schlüssel vorkommen drinstehen. dieses array hat insgesamt 74 zeichen.
ich habe dann eine for-schleife die 63 mal durchläuft und einen Zufallsgenrator initialisiert der von 0-74 geht (größe des arrays) und die zahl die der generator ausspuckt ist der wert im array der der zeichenkete für den kye hinzugefügt wird.

leider erhalte ich beim ausführen des Programms einige fehler. bei c++ war es so, das ich das program mit einer sleep-funktion 1 sek. pausieren lassen musste, bevor der zufallsgenrator neu initialisiert wird. ist das bei java auch so?

hier mal noch der quellcode:
MyFrame:
Code:
/**
 * 
 */

/**
 * @author fabianschneider
 *
 */

import java.awt.*;
import java.awt.event.*;

public class MyFrame extends Frame{
    
    Panel GeneratePanel = new Panel(); 
    
    public Button btnExit = new Button("exit");
    public Button btnGenerate = new Button("generate");
    String MyKey="Q00blubbblabb12345";
    public TextField txfKey = new TextField("                                        ");
    
    private MyActionListener myActionListener = new MyActionListener(this);
    
    public MyFrame ()
    {
        setTitle("WPA2KeyGenerator");
        setSize(400,100);
        addWindowListener(new GUIWindowListener());
        
        GeneratePanel.add(txfKey);
        
        GeneratePanel.add(btnGenerate);
        GeneratePanel.add(btnExit);
        
        add(GeneratePanel);
   
        this.btnExit.addActionListener(this.myActionListener);    
        this.btnGenerate.addActionListener(this.myActionListener);
            
        
        setVisible(true);
        
    }
    
    class GUIWindowListener extends WindowAdapter
    {
        public void windowsClosing(WindowEvent e)
        {
            e.getWindow().dispose();
            System.exit(0);
        }
    }
    
    
    public class MyActionListener implements ActionListener
    {
        public MyFrame frame;
        public MyActionListener(MyFrame frame)
        {
            this.frame=frame;
        }
        public void actionPerformed(ActionEvent e)
        {
            Object obj = e.getSource();
            if(obj == frame.btnExit)System.exit(0);
            if(obj == frame.btnGenerate)
            {
                Key WPA2Key = new Key();
                txfKey.setText(WPA2Key.generate());
                            
            }
        }
    }
    
    public static void main (String args[])
    {
        new MyFrame ();
    }
}
Klasse Key:
/**
*
*/

/**
* @author fabianschneider
*
*/

import java.util.Random;
import java.lang.*;
public class Key {

private int anzChar = 3;
private char Werte[]={'1','2','3','4','5','6','6','7','8','9','0','A','a','B','b','C','c','D','d','E','f','G','g','H','h','I','i','J','j','K','k',
'L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','w','X','x','Y','y','Z','z','#','$','!','§','%','?','(',')','/','+','-','='};
public String Key;
private int AnzWerte;
//private int Sleeptime = 1000;
public String generate()
{
Random Zufallsgenerator;
Zufallsgenerator = new Random(74);

for(int i= 0;i<anzChar;i++)
{
//try{
//Thread.sleep(Sleeptime);
AnzWerte = Zufallsgenerator.nextInt();
if(i>=1)
{
Key = String.valueOf(Werte[AnzWerte]);
}
else
{
Key=String.valueOf(Werte[AnzWerte]);
}


}


return Key;
}
}
Ich bin auch verbesserung offen, ich will ja schließlich was lernen :idea:!

vielen dank für eure Hilfe!

lg,
Fabi

EDIT: ich arbeite mit eclipse, fals das noch wichtig ist.
 

Marco13

Top Contributor
Variablennamen schreibt man klein - auch wenn's für C++ler schwer ist, sich das anzugewöhnen ;)

Ich würde dir Empfehlen, nicht AWT sondern Swing zu verwenden. Das ist moderner und bietet vieeel mehr Möglichkeiten - und ist bei solchen einfachen Beispielen wie diesen nichtmal notwendigerweise komplizierter.

Wenn irgendein Fehler auftritt: Schreib dazu welcher - und poste am besten gleich den StackTrace der Exception mit.

Der Fehler:
Zufallsgenerator = new Random(74);
erzeugt einen Zufallsgenerator mit "seed" 74 - danach können aber beliebige ints kommen (und nicht nur welche bis 74, wie du offenbar meintest). Um nur Werte von 0 bis 74 zu erhalten, mußt du
AnzWerte = Zufallsgenerator.nextInt(74);
machen.

Noch was, was für einen C++ler eine Umgewöhnung darstellen könnte: Sowas steht alles in der API-Doku: Random (Java Platform SE 6)
 

Fabi

Mitglied
Variablennamen schreibt man klein - auch wenn's für C++ler schwer ist, sich das anzugewöhnen ;)

Ich würde dir Empfehlen, nicht AWT sondern Swing zu verwenden. Das ist moderner und bietet vieeel mehr Möglichkeiten - und ist bei solchen einfachen Beispielen wie diesen nichtmal notwendigerweise komplizierter.

Wenn irgendein Fehler auftritt: Schreib dazu welcher - und poste am besten gleich den StackTrace der Exception mit.

Der Fehler:
Zufallsgenerator = new Random(74);
erzeugt einen Zufallsgenerator mit "seed" 74 - danach können aber beliebige ints kommen (und nicht nur welche bis 74, wie du offenbar meintest). Um nur Werte von 0 bis 74 zu erhalten, mußt du
AnzWerte = Zufallsgenerator.nextInt(74);
machen.

Noch was, was für einen C++ler eine Umgewöhnung darstellen könnte: Sowas steht alles in der API-Doku: Random (Java Platform SE 6)

Vielen Dank erstmal, das mit den Variablenname wusste ich, hab ich aber irgendwie ganz elegant ignoriert ;(, das werd ich ändern.
ich dachte ehrlich gesagt, das awt das neuere von beiden sei, ich meine das sogar gelesen zu haben, find ur grad den link nicht mehr!

ich würd das jetzt zuerst mal gerne mit awt fertig machen und dann das ganze mal swing basis machen!:rtfm:

also mit der änderung des zufallsgenerators funktioniert es mal soweit, das er mir bei jedem klick auf generate ein zeichen aus dem array in das Textfeld schreibt, wie schaff ich es jetzt, das die for-schleife 63 mal durchläuft, die chracter variablen aneinanderhängt und zu nem string macht. bzw die chracters gleich beim aufrufen zu nem string macht?!

danke für die Hilfe!

lg,
Fabi

EDIT nach dem ich die Klasse Key so angepasst habe:
anzChar ist jetzt gleich 63! hat das was mit dem zufallsgenerator zu tun?
Code:
/**
 * 
 */

/**
 * @author fabianschneider
 *
 */

import java.util.Random;
import java.lang.*;
public class Key {
    
    private int anzChar = 63;
    private char Werte[]={'1','2','3','4','5','6','6','7','8','9','0','A','a','B','b','C','c','D','d','E','f','G','g','H','h','I','i','J','j','K','k',
            'L','l','M','m','N','n','O','o','P','p','Q','q','R','r','S','s','T','t','U','u','V','w','X','x','Y','y','Z','z','#','$','!','§','%','?','(',')','/','+','-','='};
    public String Key;
    private int AnzWerte;
    //private int Sleeptime = 1000;
    public String generate()
    {
        Random Zufallsgenerator;
        Zufallsgenerator = new Random();
        
         for(int i= 0;i<anzChar;i++)
         {
            //try{ 
            //Thread.sleep(Sleeptime);
            AnzWerte = Zufallsgenerator.nextInt(74);
             if(i>=1)
             {
                 Key = Key+String.valueOf(Werte[AnzWerte]);
             }
             else
             {
                 Key=String.valueOf(Werte[AnzWerte]);
             }
         
            //catch(InterruptedException ie)
            
         }        
            
         
        return Key;
    }
}
erhalte ich folgende Fehlermeldung:
Code:
at java.awt.Button.processEvent(Button.java:356)
    at java.awt.Component.dispatchEventImpl(Component.java:4068)
    at java.awt.Component.dispatchEvent(Component.java:3903)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
    at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:190)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:176)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
 
Zuletzt bearbeitet:

X5-599

Top Contributor
Interessant wäre jetzt noch die genaue Art der Exception die geworfen wird. Die hast du ausgelassen. Steht normalerweise in der Zeile vor:

at java.awt.Button.processEvent(Button.java:356)


Gruß,
Michael
 

X5-599

Top Contributor
habs grad nochmal ausprobiert. Ich bekomme eine
Code:
java.lang.ArrayIndexOutOfBoundsException
Und das hat folgenden Grund: Dein Werte Array hat 71 Einträge. Index 0 ..70. Dein Zufallsgenerator liefert Zahlen von: 0 bis 73. Also können für das Werte Array ungültige Indeces generiert werden.

Einfach die Zeile:
Code:
AnzWerte = Zufallsgenerator.nextInt(74);
in
Code:
AnzWerte = Zufallsgenerator.nextInt(71);
ändern.

Gruß,
Michael
 

Fabi

Mitglied
habs grad nochmal ausprobiert. Ich bekomme eine
Code:
java.lang.ArrayIndexOutOfBoundsException
Und das hat folgenden Grund: Dein Werte Array hat 71 Einträge. Index 0 ..70. Dein Zufallsgenerator liefert Zahlen von: 0 bis 73. Also können für das Werte Array ungültige Indeces generiert werden.

Einfach die Zeile:
Code:
AnzWerte = Zufallsgenerator.nextInt(74);
in
Code:
AnzWerte = Zufallsgenerator.nextInt(71);
ändern.

Gruß,
Michael

Vielen Dank für die Antwort, jetzt geht es :)!

jetzt hätt ich noch ne frage, wie mach ich denn jetzt daraus ein *.jar file, das man ausführen kann? ein icon dazu wäre auch ganz gut!

lg,
Fabi
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
A Zufallszahlen & Laufzeitmessung (insertionSort)? Allgemeine Java-Themen 2
Anas Zufallszahlen & Laufzeitmessung (insertionSort) Allgemeine Java-Themen 5
A Methoden Matrixfelder mit Zufallszahlen befüllen Allgemeine Java-Themen 6
Q int-Array mit Zufallszahlen füllen Allgemeine Java-Themen 3
S Wie Zufallszahlen in txt speichern? Allgemeine Java-Themen 4
L Zufallszahlen mit Random.nextdouble() Allgemeine Java-Themen 3
T Zufallszahlen generieren und dabei eine Zahl weglassen Allgemeine Java-Themen 4
D einmalige Zufallszahlen erstellen Allgemeine Java-Themen 10
A Problem mit Zufallszahlen und Multithreading Allgemeine Java-Themen 14
M nicht gleichverteilte Zufallszahlen generieren Allgemeine Java-Themen 6
R 1000 Zufallszahlen Allgemeine Java-Themen 9
H Zufallszahlen und JSP Allgemeine Java-Themen 3
N Zufallszahlen in einem gegebenen Bereich erzeugen Allgemeine Java-Themen 9
M Input/Output Mausklick außerhalb des Frames registrieren Allgemeine Java-Themen 2
S grafische Textausgabe außerhalb eines Frames Allgemeine Java-Themen 5
D Frames und Container Allgemeine Java-Themen 16
E focus problem (mit mehreren frames) Allgemeine Java-Themen 10
Q Methode soll auf schließen eines Frames warten Allgemeine Java-Themen 4
N Java Webanwendung ohne Frames Allgemeine Java-Themen 5
S Layout bei Frames Allgemeine Java-Themen 2
C JOptionDialog und Frames Allgemeine Java-Themen 9
P HTML-Frames im JFame Allgemeine Java-Themen 4

Ähnliche Java Themen

Neue Themen


Oben