2011-01-30 10 views
5

私のハングマンゲーム(SEE PICTURE HERE)のキーボードのようなボタンを作っています。私の問題は内部クラスです。私はこの内部クラスについてLINKを読んでおり、FINALタイプの外部変数にしかアクセスできないと言います。しかし、変数を宣言しても、変数をそれ以上変更することはできません。だから私の問題は、内部クラスの内部の値を変更する必要があるということです。私のコードは次の通りです:Javaの内部クラス

public class MainGame extends JDialog { 

    private String player; 
    private char [] wordChar; 
    private JButton[] buttons; 
    private int level; 
    private int score; 
    private int livesLeft; 
    private int missedGuess; 

void newGame() { 

     level = 0; 
     score = 0; 
     livesLeft = 10; 
     missedGuess = 0; 

     //label1: 
     // while (livesLeft!= 0) { 

      //get random WORD from LIST 
      Word hiddenWord = new Word(); 

      //put random word in Array 
      wordChar = new char[hiddenWord.getHiddenWord().length()]; 
      wordChar = hiddenWord.getHiddenWord().toCharArray(); 

      buttons = new JButton[wordChar.length]; 
      for (int i = 0; i < wordChar.length; i++){ 
       JButton guessWord = new JButton(" "); 
       guessWord.setFont(new Font("Microsoft Sans Serif", 1, 18)); 
       guessWord.setEnabled(false); 

       jPanel3.setLayout(new GridLayout(1, wordChar.length)); 
       jPanel3.add(guessWord); 

       buttons[i] = guessWord; 
      } 
     checkLetter(); 
     } 

    void checkLetter() { 
     int checker = 0; 
     while(checker != wordChar.length){ 
      jPanel1.setLayout(new GridLayout(3, 9, 3, 5)); 
      for (char buttonChar = 'a'; buttonChar <= 'z'; buttonChar++) { 
       String buttonText = String.valueOf(buttonChar); 
       final JButton letterButton = new JButton(buttonText); 
       letterButton.addActionListener(new ActionListener() { 
        public void actionPerformed(ActionEvent e) { 
         String actionCommand = e.getActionCommand(); 
         for (int j = 0; j < wordChar.length; j++){ 
          String text = String.valueOf(wordChar[j]); 
          if(actionCommand.equals(text)){ 
           buttons[j].setText(text); 
           checker++; //THIS CODE IS NOT POSSIBLE!!!! 
          } 
         } 
        } 
       }); 
       jPanel1.add(letterButton); 
      } 
       checker++; 
      } 
     } 

注:上記のコードは完全ではありません。 intチェッカーは、すでに推定されている正しい文字の数をカウントするために使用されるので、単語の長さと等しい場合、次のレベルに進むことができます。enter image description here

コードを再作成するにはどうすればよいですか?

+0

明らかなコントロールチェックとは別に、「チェッカー」が何をしているのかを説明すると、人々が設計の選択肢を提案するのに役立つかもしれません。 – Carl

答えて

3

外部クラスのフィールドとしてcheckerを宣言し、increaseChecker()のような何らかの方法でアクセスできます。

UPDATE:このような何か:

1)外部クラスでチェッカーフィールドを作成します。

public class OuterClassName { 
    private int checker; 

    protected void increaseChecker() { 
     checker++; 
    } 

    void checkLetter() { 
     // ... 
    } 

} 

2)あなたがアクセスすることはできません代わりにchecker++

+0

私は理解していません:( – newbie

+0

答えは – Kel

3

increaseChecker()メソッド呼び出しを使用します匿名の内部クラスのローカル変数、それは正当な理由があります。 actionPerformed()メソッドは、checkLetter()関数内で呼び出されることは保証されていません。関数は終了した後、おそらく(そしておそらく)呼び出され、ローカル変数はその時までに破棄されます。したがって、新しく作成された匿名クラスは暗黙的にその変数のコピーを取得します。しかし、コピーを増やす意味がないので、匿名クラスのメソッドから最終的なローカル変数だけにアクセスすることができます。

最も簡単な回避策は、外部クラスのフィールドをcheckerにすることです。しかし、checkLetter()の呼び出しの間にその値を保持する必要がないかぎり、checkLetter()関数内でのみアクセスされると、それは意味をなさないでしょう。本当の答えを知るには、なぜあなたがactionPerformed()内でcheckerを増やそうとしているのか考える必要がありますか?いつそれが起こり、あなたはそれをやって何を達成しようとしていますか?

+0

のアップデートを参照してください。intチェッカーは、すでに推測されている正しい文字の数をカウントするために使用されるので、単語の長さと等しい場合、レベルでは – newbie

+1

@newbie:ゲームが終了するまで、変数 'checker'が存在する必要があります。Javaでは、メソッドのローカル変数はそのメソッドが実行されている間のみ存在しますので、' checker'は現在、 'wordChar'のようにゲームが終わるまで存在するはずです。したがって、' wordChar'を実行するときに 'checker'を宣言し、' newGame() 'でリセットするのが簡単な解決法です。 – meriton

1

匿名の内部クラスはそのままにして、クラスのメソッドを呼び出さないようにしてください。このようにファイナルは問題ではありません。

  letterButton.addActionListener(new ActionListener() { 
       public void actionPerformed(ActionEvent e) { 
        letterButtonActionPerformed(e); // create this method 
       } 
      }); 


      //..... 


      // new method 
      private void letterButtonActionPerformed(ActionEvent e) { 
        String actionCommand = e.getActionCommand(); 
        for (int j = 0; j < wordChar.length; j++){ 
         String text = String.valueOf(wordChar[j]); 
         if(actionCommand.equals(text)){ 
          buttons[j].setText(text); 
          checker++; //THIS CODE IS NOT POSSIBLE!!!! 
         } 
        } 
      } 
関連する問題