2016-04-03 11 views
-4

私は基本的にチックタックのつま先ゲームをAIとすべてで作成しています。私のシステムではボタンを描き、各ボタンにブール値を割り当てて、 Xで、空であればFALSEを返します。それが正しいサイズとレイアウトとすべてに引き出すが、私のアクションリスナーにそれは私にエラーを与える:最終的なローカル変数のエラー

編集:私はtrueにブール値を変更すると、まだエラーに

"The final local variable cannot be assigned since it is defined in an enclosing type."

を与え、決勝を削除ボタンテキストを 'x'に割り当てた後

package myClass; 
import java.awt.Dimension; 
import java.awt.GridLayout; 

import javax.swing.JButton; 
import javax.swing.JFrame; 

public class mainClass { 

    public static void main(String[] args) { 
     //create window 
     JFrame mainWindow = new JFrame("Tic Tac Toe"); 
     //properties of mainWindow 
     mainWindow.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     mainWindow.setSize(600, 600); // buttons will fill entirely, 200x200 buttons 
     mainWindow.setLayout(new GridLayout(3, 3)); 

     //create buttons 
     JButton topLeft = new JButton(""); 
     JButton topMid = new JButton(""); 
     JButton topRight = new JButton(""); 
     JButton midLeft = new JButton(""); 
     JButton midMid = new JButton(""); 
     JButton midRight = new JButton(""); 
     JButton botLeft = new JButton(""); 
     JButton botMid = new JButton(""); 
     JButton botRight = new JButton(""); 


     //checker for if the button already has a character 
boolean tmid = false; 
boolean tright = false; 
boolean mleft = false; 
boolean mmid = false; 
boolean mright = false; 
boolean bleft = false; 
boolean bmid = false; 
boolean bright = false; 

     //button properties 
     Dimension buttonSize = new Dimension(200,200); 
     topLeft.setSize(buttonSize); 
     topMid.setSize(buttonSize); 
     topRight.setSize(buttonSize); 
     midLeft.setSize(buttonSize); 
     midMid.setSize(buttonSize); 
     midRight.setSize(buttonSize); 
     botLeft.setSize(buttonSize); 
     botMid.setSize(buttonSize); 
     botRight.setSize(buttonSize); 

     //Action listener 
     topLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tleft == false){ 
       topLeft.setText("X"); 
       tleft = true; 
      } 
      } 
     }); 
     topMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tmid == false){ 
       topMid.setText("X"); 
       tmid = true; 
      } 
      } 
     }); 
     topRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(tright == false){ 
       topRight.setText("X"); 
       tright = true; 
      } 
      } 
     }); 
     midLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mleft == false){ 
       midLeft.setText("X"); 
       mleft = true; 
      } 
      } 
     }); 
     midMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mmid == false){ 
       midMid.setText("X"); 
       mmid = true; 
      } 
      } 
     }); 
     midRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(mright == false){ 
       midRight.setText("X"); 
       mright = true; 
      } 
      } 
     }); 
     botLeft.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bleft == false){ 
       botLeft.setText("X"); 
       bleft = true; 
      } 
      } 
     }); 
     botMid.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bmid == false){ 
       botMid.setText("X"); 
       bmid = true; 
      } 
      } 
     }); 
     botRight.addMouseListener(new java.awt.event.MouseAdapter() { 
      public void mouseClicked(java.awt.event.MouseEvent evt) { 
      if(bright == false){ 
       botRight.setText("X"); 
       bright = true; 
      } 
      } 
     }); 




     //draw components 
     mainWindow.add(topLeft); 
     mainWindow.add(topMid); 
     mainWindow.add(topRight); 
     mainWindow.add(midLeft); 
     mainWindow.add(midMid); 
     mainWindow.add(midRight); 
     mainWindow.add(botLeft); 
     mainWindow.add(botMid); 
     mainWindow.add(botRight); 

     mainWindow.setVisible(true); // draw it 
    } 


} 
+5

はい、最終変数(例: 'final boolean tleft')は_final_であり、初期化後に変更することはできません。 – KevinO

+5

「最終的に」とはどういう意味ですか? –

答えて

0

2つの問題があります。 1つは、最終変数を変更することはできません。 2つ目は、最終変数を使用してリスナー内にスコープを設定する必要があることです。このコードでは、深刻なリファクタリングが必要です。ただし、最小の介入を必要とする迅速な解決策がここにあります。

  1. main()メソッドの定義

    enum ESide { 
        tleft, tmid, tright, 
        mleft, mmid, mright, 
        bleft, bmid, bright, 
    

    }の外この列挙を追加boolean tleft; boolean tmid; ...変数

  2. の全てを削除します。

  3. は、必要に応じてtleftを調整し、次のようにリスナーを交換し、適切な場所で

    // checker for if the button already has a character 
    final Map<ESide, Boolean> board = new HashMap<>(); 
    for (ESide side : ESide.values()) { 
        board.put(side, false); 
    } 
    
  4. をこの定義を追加します。ただし、マウスアダプタを返すメソッドを作ることを真剣に検討してください。

    public void mouseClicked(java.awt.event.MouseEvent evt) 
        { 
         if (board.get(ESide.tleft).booleanValue() == false) { 
          topLeft.setText("X"); 
          board.put(ESide.tleft, true); 
         } 
        } 
    

あなたが受けているエラーが解消されます。

+0

私は非常にJavaを知っていたので、私は知らなかった(これはたくさんあり、JFrameがどのように働いていたかをたくさん学ばなくてはなりませんでした)私はgoogleにしなければなりませんでした。 "この行に複数のマーカーがあります。 \t - トークンに構文エラーがあります。"( ";"; "予期しない" \t - トークンの構文エラー ")"、;予期しています \t - 無効な型は変数mouseClicked "ここに私のコードです。エラーは、58行目のhttp://pastebin.com/ZmrL33aN –

+0

@JakeHendersonにあります。エラーが発生した可能性はありますが、元のコードでは、たとえば、 'topLeft.addMouseListener(new java.awt.event.MouseAdapter (){...} 'それぞれの' addMouseListener'エントリでは、私が提案した 'public void mouseClicked'を追加する必要がありますが、それぞれのために' ESide.tleft'を修正してさらに問題がある場合は、新しい質問を開始してください。 – KevinO