Shuffle String aus if-clause

SXR1US

Mitglied
Hallo,
ich habe selbstständig versucht einen Passwort-Generator zu coden. Soweit hat auch alles funktioniert, nur zum Ende möchte ich alle Strings (Sonderzeichen, Zahlen, Buchstaben) nochmal mischen. Da die Strings aber in den if-clauses sind weiß ich nicht mehr weiter. Kann mir vielleicht jemand helfen?
[CODE lang="java" highlight="89-165"]import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.Random;



public class Generator extends JFrame {

private JPanel contentPane;
private JTextField anzahlZeichen;
private JTextField pw;



String eingabe;
int value;

public static void main(String[] args) {

Generator frame = new Generator();
frame.setVisible(true);
}

public Generator() {
setTitle("Generator");
setDefaultCloseOperation(EXIT_ON_CLOSE);
setBounds(1100, 600, 450, 308);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
setContentPane(contentPane);


ImageIcon icon = new ImageIcon("C:/Users/Simon/IdeaProjects/generator/src/th.jpg");
icon.setImage(icon.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT));
JLabel l1 = new JLabel(icon);
add(l1);


anzahlZeichen = new JTextField();
contentPane.add(anzahlZeichen, "cell 0 1,growx,aligny top");
anzahlZeichen.setColumns(5);

pw = new JTextField();
contentPane.add(pw);
pw.setColumns(15);


JLabel T = new JLabel("Anzahl Zeichen");
contentPane.add(T, "cell 0 0,growx,aligny top");


JCheckBox checkBoxBuchstaben = new JCheckBox("Buchstaben");
JCheckBox checkBoxZahlen = new JCheckBox("Zahlen");
JCheckBox checkBoxSonderzeichen = new JCheckBox("Sonderzeichen");

contentPane.add(checkBoxBuchstaben);
contentPane.add(checkBoxSonderzeichen);
contentPane.add(checkBoxZahlen);




JButton create = new JButton("Create");
contentPane.add(create);
create.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
if (anzahlZeichen.getText().isEmpty()) {
JOptionPane.showMessageDialog(null, "Keine Zahl angegeben!");
} else {
eingabe = anzahlZeichen.getText();
value = Integer.parseInt(eingabe);

}



if(!checkBoxBuchstaben.isSelected() && !checkBoxZahlen.isSelected() && !checkBoxSonderzeichen.isSelected() ){
JOptionPane.showMessageDialog(null, "Nichts ausgewählt");
}

for(int i = 1; i <= value; i++) {


if (checkBoxBuchstaben.isSelected()) {
String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
String randomString = "";
int numbers = (int) (Math.random()* 10);

int length = 2;



Random rand = new Random();



char[] text = new char[length];

for(int x = 1; x < length; x++){
text[x] = chars.charAt(rand.nextInt(chars.length()));
}

for(int x = 1; x < text.length; x++) {
randomString += text[x];
}


System.out.println(randomString);
String lower = randomString.toLowerCase(Locale.ROOT);
System.out.println(lower);


}
if (checkBoxSonderzeichen.isSelected()) {
String chars = "!@#&()–[{}]:;',?/*\"~$^+=<>";
String randomString = "";
int numbers = (int) (Math.random()* 10);

int length = 2;



Random rand = new Random();



char[] text = new char[length];

for(int x = 1; x < length; x++){
text[x] = chars.charAt(rand.nextInt(chars.length()));
}

for(int x = 1; x < text.length; x++) {
randomString += text[x];
}

System.out.println(randomString);
}

if (checkBoxZahlen.isSelected()) {
String chars = "1234567890";
String randomString = "";
int numbers = (int) (Math.random() * 10);

int length = 2;


Random rand = new Random();



char[] text = new char[length];

for (int x = 1; x < length; x++) {
text[x] = chars.charAt(rand.nextInt(chars.length()));
}

for (int x = 1; x < text.length; x++) {
randomString += text[x];
}


}




}





}
});



}
}
[/CODE]
 
Java:
String randomString;
for ...
    if(checkBox)
    randomString.zeichenHinzufügen
    else
    randomString.sonderzeichenHinzufügen
deklarier deinen String vor den ifs ...oder versteh ich dein Problem gerade falsch

so wie du deine Frage gestellt hast bekommst du deine Strings nicht aus den Ifs raus ...dh du deklarierst vorher deinen String
 
Ja, das habe ich auch schon gefunden, aber wo soll ich denn die Variable deklarieren? Bei mir findet er die Variable nicht, wenn ich in Zeile 16ff die Strings deklariere, auch wenn ich allen einen anderen Namen gebe. Ich will ja alle 3 Strings vermischen.
 
Java:
......
                for(int i = 1; i <= value; i++) {
                    eingabe = "hi";

                    if (checkBoxBuchstaben.isSelected()) {
                        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                        String randomString = "";
    ......
das funktioniert zb..den Eingabe String von ausserhalb innen zu benutzen ..das hast du auch schon getan mit der Eingabe...

jetzt musst du halt das exakt gleiche für die anderen Strings tun ich weis nicht genau wo das problem liegt weil du es schon mal im Code gemacht hast 😀
 
Ich verstehe es auch nicht, wenn ich unter meine eingabe und value noch diese 3 Strings dekliniere

Java:
String BS;
    String SZ;
    String Z;

und jeweils die RandomStrings mit den neuen ersetze und unten System.out.println(SZ + BS + Z); mache kommt nur null raus.
 
Ich verstehe es auch nicht, wenn ich unter meine eingabe und value noch diese 3 Strings dekliniere

Java:
String BS;
    String SZ;
    String Z;

und jeweils die RandomStrings mit den neuen ersetze und unten System.out.println(SZ + BS + Z); mache kommt nur null raus.
String BS = "";

du hast sie deklariert aber nicht initialisiert und ich glaub dein Code braucht einen String ohne Zeichen... hab ihn nur überflogen
 
Habe ich gemacht, nun kommt kein null mehr, aber die Werte werden nicht in den Strings gespeichert. Er gibt halt nur die leeren Strings von oben aus und nicht die, die dann das Passwort beinhalten.
 
Java:
import javax.swing.*;
import javax.swing.border.EmptyBorder;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Locale;
import java.util.Random;



public class Generator extends JFrame {

    private JPanel contentPane;
    private JTextField anzahlZeichen;
    private JTextField pw;



    String eingabe;
    int value;
    String BS = "";
    String SZ = "";
    String Z = "";


    public static void main(String[] args) {

        Generator frame = new Generator();
        frame.setVisible(true);
    }

    public Generator() {
        setTitle("Generator");
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setBounds(1100, 600, 450, 308);
        contentPane = new JPanel();
        contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
        setContentPane(contentPane);


        ImageIcon icon = new ImageIcon("C:/Users/Simon/IdeaProjects/generator/src/th.jpg");
        icon.setImage(icon.getImage().getScaledInstance(20, 20, Image.SCALE_DEFAULT));
        JLabel l1 = new JLabel(icon);
        add(l1);


        anzahlZeichen = new JTextField();
        contentPane.add(anzahlZeichen, "cell 0 1,growx,aligny top");
        anzahlZeichen.setColumns(5);

        pw = new JTextField();
        contentPane.add(pw);
        pw.setColumns(15);


        JLabel T = new JLabel("Anzahl Zeichen");
        contentPane.add(T, "cell 0 0,growx,aligny top");


        JCheckBox checkBoxBuchstaben = new JCheckBox("Buchstaben");
        JCheckBox checkBoxZahlen = new JCheckBox("Zahlen");
        JCheckBox checkBoxSonderzeichen = new JCheckBox("Sonderzeichen");

        contentPane.add(checkBoxBuchstaben);
        contentPane.add(checkBoxSonderzeichen);
        contentPane.add(checkBoxZahlen);




        JButton create = new JButton("Create");
        contentPane.add(create);
        create.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                if (anzahlZeichen.getText().isEmpty()) {
                    JOptionPane.showMessageDialog(null, "Keine Zahl angegeben!");
                } else {
                    eingabe = anzahlZeichen.getText();
                    value = Integer.parseInt(eingabe);

                }



                if(!checkBoxBuchstaben.isSelected() && !checkBoxZahlen.isSelected() && !checkBoxSonderzeichen.isSelected() ){
                    JOptionPane.showMessageDialog(null, "Nichts ausgewählt");
                }

                for(int i = 1; i <= value; i++) {


                    if (checkBoxBuchstaben.isSelected()) {
                        String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
                        String BS = "";
                        int numbers = (int) (Math.random()* 10);

                        int length = 2;



                        Random rand = new Random();

                        //int length = rand.nextInt(15);

                        char[] text = new char[length];

                        for(int x = 1; x < length; x++){
                            text[x] = chars.charAt(rand.nextInt(chars.length()));
                        }

                        for(int x = 1; x < text.length; x++) {
                            BS += text[x];
                        }


                        System.out.println(BS);
                        String lower = BS.toLowerCase(Locale.ROOT);
                        System.out.println(lower);


                    }
                    if (checkBoxSonderzeichen.isSelected()) {
                        String chars = "!@#&()–[{}]:;',?/*\"~$^+=<>";
                        String SZ = "";
                        int numbers = (int) (Math.random()* 10);

                        int length = 2;



                        Random rand = new Random();

                        //int length = rand.nextInt(15);

                        char[] text = new char[length];

                        for(int x = 1; x < length; x++){
                            text[x] = chars.charAt(rand.nextInt(chars.length()));
                        }

                        for(int x = 1; x < text.length; x++) {
                            SZ += text[x];
                        }

                        System.out.println(SZ);
                    }

                        if (checkBoxZahlen.isSelected()) {
                            String chars = "1234567890";
                            String Z = "";
                            int numbers = (int) (Math.random() * 10);

                            int length = 2;


                            Random rand = new Random();

                            //int length = rand.nextInt(15);

                            char[] text = new char[length];

                            for (int x = 1; x < length; x++) {
                                text[x] = chars.charAt(rand.nextInt(chars.length()));
                            }

                            for (int x = 1; x < text.length; x++) {
                                Z += text[x];
                            }
                            System.out.println(Z);

                        }


                    System.out.println(SZ + BS + Z);

                    }





            }
        });



    }
}
 
1. Zeile95 =
Java:
String BS ="";
Zeile21 =
Java:
String BS ="";
Welches wird hergenommen? das ist schon mal das erste

Du willst das Äussere hernehmen ... ja dann lass einfach beim inneren das "String" weg

2. int length = 2;
diese zeile hast du überall dh. jede for schleife kann nur 1 mal durchlaufen ewil du immer x = 1 setzt
und length = 2 ...das kann maximal einmal durchlaufen...

3. nimmt man nur diesen Teil an Code raus zb
Java:
       String chars = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
        String BS = "";

        int length = 2;


        Random rand = new Random();

        char[] text = new char[length];

        for(int x = 1; x < length; x++){
            text[x] = chars.charAt(rand.nextInt(chars.length()));
        }

        for(int x = 1; x < text.length; x++) {
            BS += text[x];
        }


        System.out.println(BS);
funktioniert es auch ich bekomme immer 1 Zufälligen Buchstaben der auch ausgegeben wird
dh es funktioniert teilweise nur man müsste es in Ordnung bringen...

was ICH tun würde
ich würde beim generator 3 Strings als final deklarieren..die werden und sollen sich nicht verändern im Laufe des Programms
Java:
private final stringLetters ="ABCDEFGHIJKLMNOPQRSTUVWXYZ";
private final stringNumbers = "1234567890";
private final stringSpecialChars = "!@#&()–[{}]:;',?/*\"~$^+=<>";
private String generatedPassword = "";
so weiter unten hast du 3 mal den gleichen code du hast

Java:
                            String chars = "1234567890";
                            String Z = "";
                            int numbers = (int) (Math.random() * 10);

                            int length = 2;


                            Random rand = new Random();

                            //int length = rand.nextInt(15);

                            char[] text = new char[length];

                            for (int x = 1; x < length; x++) {
                                text[x] = chars.charAt(rand.nextInt(chars.length()));
                            }

                            for (int x = 1; x < text.length; x++) {
                                Z += text[x];
                            }
                            System.out.println(Z);

                        }


                    System.out.println(SZ + BS + Z);
3mal enthalten...wenn ein Code 3 mal absolut gleich ist = in eine Methode... deswegen hätte ich auch oben die Strings festgelegt

da du deine ifs jetzt komplett runter kürzen kannst weil du einfach der Methode den String übergibst wo es die Zufallswerte rauspicken soll
dh du brauchst die Methode um deinem Passwort ein Zeichen hinzuzufügen
Java:
public void appendChar(String stringMitCharZeichen){
    //... zufalls Char erzeugen was du hast UND das was funktioniert
    generatedPassword += zufallsChar;
}

in deinem Handler hast du ja schon die richtigen Möglichkeiten abgedeckt wie man die Sachen ankreuzen kann
nur statt den ganzen code auszuführen willst du jetzt die neue Methode mit dem richtigen String ausführen
Java:
if(checkboxSonderzeichen.isSelected()){
    appendChar(stringSpecialChars);
}

SO wenn du soweit gekommen bist und in generatedPassword dein Komplettes Passwort drin steht... musst du es noch mischen und brauchst da nochma eine Methode aber die packst du sicher dann


PS: "müssen" tust du gar nichts...ich war noch nie gut im ausformulieren von schönen sätzen
 

Zurück
Oben