2017-05-10 5 views
0

私は既にパスワードジェネレータをコード化しましたが、作成したパスワードを表示するJFrameを作成したいと考えています。 これは私のコードです: クラスpasswortループ内で定義されたStringを別のクラスで使用するにはどうすればよいですか?

public class passwort 
{ 
    public static void main(String[] args){ 
     Passwortgenerator fritz = new Passwortgenerator();  
     fritz.passwortausgeben(); 
    } 
} 

クラスPasswortgenerator

public class Passwortgenerator 
{ 
    public int x; 

    public Passwortgenerator() { 
     this(1); 
    } 
    public Passwortgenerator(int x) { 
     this.x = x; 
    } 
    public void passwortausgeben(){ 

      int d=Zufallsgenerator.zufallszahl(); 
      int k=0; 


       String[] alpha = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1"}; 

       for(int i=0; i<alpha.length; i++){ 
        for(int j=0; j<alpha.length; j++){ 
         for(int l=0; l<alpha.length; l++){ 
          for(int m=0; m<alpha.length; m++){ 


           if(k<d){ 
            k++; 


           }else{ 
            System.out.print(k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]); 

            String y=k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]; 


            System.out.print(y); 
            System.exit(0); 
           } 
          } 
         } 
        } 
       }   
      } 
     } 

クラスZufallsgenerator:

import java.util.Random; 

public final class Zufallsgenerator 
{ 
    public void main(String[] args){ 
     zufallszahl(); 
    } 
    public static int zufallszahl(){ 
     Random Hanz = new Random(); 
     int d = Hanz.nextInt(100000); 
     return d; 


    } 

} 

クラスフェンスター:

import javax.swing.JFrame; 
import javax.swing.JLabel; 

public final class Fenster 
{ 
    public static void main(String[] args) 
    { 
     JFrame meinFrame = new JFrame("3");   
     meinFrame.setSize(200,200); 
     meinFrame.add(new JLabel(y)); 
     meinFrame.setVisible(true); 
    } 
} 

すべてうまくいっていますが、JFrameクラスを呼び出す方法と、2番目のクラスによって作成されたStringを使用する方法を見つけることができません。ループ内からStringを使用することはできないことをすでに知っていましたが、何もできませんでした。 ご協力いただきありがとうございます。

+0

フェンスターはいつ呼び出されますか? – Tony

+0

申し訳ありませんが、このクラスの呼び出し方法もわかりません。これを行う方法の提案がありますか? – LuisIsLuis

+0

これをいつ呼び出すべきですか? – Tony

答えて

1

デザインの関連する部分は、このです:あなたの方法だけでなく、パスワードを生成

public void passwortausgeben(){ 
    // ... 
           System.out.print(y); 
           System.exit(0); 
} 

、それはまた、ユーザーにそれを表示するため、また、あなたの人生を制御するための責任を扱いますプログラム(すなわちすぐに終了)。

あなたは本当にそれらの懸念を分離したいと思います。パスワードのみを生成するようにメソッドを変更します。それは他に何か責任を負う必要はありません。

public String passwortausgeben(){ 
    // ... 
           return y; 
} 

次に、他の懸念事項を別々に処理できます。コンソール使用の場合:

public class passwort 
{ 
    public static void main(String[] args){ 
     Passwortgenerator fritz = new Passwortgenerator();  
     final String password = fritz.passwortausgeben(); 
     System.out.print(password); 
     // Note: no System.exit() is actually needed here, since the method 
     // will end, and all threads have terminated, so the program 
     // will exit naturally. 
    } 
} 

次に、それをSwing GUIで表示する代替方法を使用できます。あなたのFensterクラスが「main()」メソッドを持っているので、あなたのプログラムとして直接実行すること

import javax.swing.JFrame; 
import javax.swing.JLabel; 

public final class Fenster 
{ 
    public static void main(String[] args) 
    { 
     Passwortgenerator fritz = new Passwortgenerator();  
     final String password = fritz.passwortausgeben(); 

     JFrame meinFrame = new JFrame("3");   
     meinFrame.setSize(200,200); 
     meinFrame.add(new JLabel(password)); 
     meinFrame.setVisible(true); 
    } 
} 

注:たとえば。 passwortクラスは使用されません。プログラムをコマンドラインで実行していて、正しいディレクトリにある場合は、java Fenster。 IDEを使用している場合は、Javaランタイムに「メイン」クラスとして使用するクラスを指示するようにIDEの実行を設定する必要があります。




passwortausgeben()を変更するための一つの方法の完全な例。あなたのコンパイラがあなたに言ったように、メソッドは値を返す必要があります。つまり、すべての値を返す必要があります。あなたの成功した世代は条件付きの声明の中にあるので、それは起こるかもしれません。

public String passwortausgeben(){ 
    int d=Zufallsgenerator.zufallszahl(); 
    int k=0; 

    String[] alpha = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1"}; 

    for(int i=0; i<alpha.length; i++){ 
     for(int j=0; j<alpha.length; j++){ 
      for(int l=0; l<alpha.length; l++){ 
       for(int m=0; m<alpha.length; m++){ 
        if(k<d){ 
         k++; 
        }else{ 
         String y=k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]; 
         return y; 
        } 
       } 
      } 
     } 
    } 

    throw new IllegalStateException("the loops all ended before k>=d, no password generated"); 
    } 

方法を設計する別の方法は、(これは今、数年前から利用されているJavaの8、必要)(dは、パスワードを生成することは決してないだろう。その場合には、あまりにも大きくなる可能性があります)

public Optional<String> passwortausgeben(){ 
    int d=Zufallsgenerator.zufallszahl(); 
    int k=0; 

    String[] alpha = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1"}; 

    for(int i=0; i<alpha.length; i++){ 
     for(int j=0; j<alpha.length; j++){ 
      for(int l=0; l<alpha.length; l++){ 
       for(int m=0; m<alpha.length; m++){ 
        if(k<d){ 
         k++; 
        }else{ 
         String y=k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]; 
         return Optional.of(y); 
        } 
       } 
      } 
     } 
    } 

    return Optional.empty(); 
    } 

また、メソッドの途中で戻ることを避けるためです。これは、深くネストされたループと、答えが分かれば無駄な作業をやめたいという欲求のため、ちょっと厄介です。 4つのループのそれぞれを終了する必要がありますが、breakは、breakステートメントを含むループのみを終了します。 Javaにはbreakで使用できるラベルがありますが、これはほとんど使用されず、記憶もされていません。

public Optional<String> passwortausgeben(){ 
    int d=Zufallsgenerator.zufallszahl(); 
    int k=0; 

    String[] alpha = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1"}; 
    String result = null; 

    for(int i=0; i<alpha.length && result==null; i++){ 
     for(int j=0; j<alpha.length && result==null; j++){ 
      for(int l=0; l<alpha.length && result==null; l++){ 
       for(int m=0; m<alpha.length && result==null; m++){ 
        if(k<d){ 
         k++; 
        }else{ 
         result = k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]; 
        } 
       } 
      } 
     } 
    } 

    return Optional.ofNullable(result); 
    } 

実際の質問とは無関係に、ループを削除して一部の部門に置き換えることができます。

public String passwortausgeben(){ 
    int d=Zufallsgenerator.zufallszahl(); 
    final int k = d; 

    String[] alpha = {"a","b","c","d","e","f","g","h","i","j","k","l","m","n","o","p","q","r","s","t","u","v","w","x","y","z","1"}; 

    int i = d/(alpha.length*alpha.length*alpha.length); 
    d -= (i*alpha.length*alpha.length*alpha.length); 

    int j = d/(alpha.length*alpha.length); 
    d -= (j*alpha.length*alpha.length); 

    int l = d/alpha.length; 

    // the remainder 
    int m = d % alpha.length; 

    if (i < alpha.length) 
     { return k + " " + alpha[i] + alpha[j] + alpha[l] + alpha[m]; } 
    else 
     { throw new IllegalStateException("Number is too large. No password generated"); } 
    } 
+0

詳しい説明をありがとう。これは、私がpasswortクラスを削除できることを意味しますか? – LuisIsLuis

+0

私はFensterクラスもコンパイルできません: 'final String password = fritz.passwortausgeben();' – LuisIsLuis

+0

'passwortausgeben()'の戻り値の型を ' void'を 'String'に変換しますか? – dsh

関連する問題