Java 最终局部变量误差

Java 最终局部变量误差,java,Java,我基本上是在做一个tic-tac-toe游戏,使用AI和所有工具,我的系统是绘制按钮,并为每个按钮分配一个布尔值,如果它被X占据,则分配为true,如果它为空,则分配为false。它绘制到正确的大小和布局,除了在我的动作侦听器中,它给了我错误: 编辑:删除了总决赛,仍然给出了错误 “无法分配最终局部变量,因为它是在 封闭类型。” 将按钮文本指定给“x”后,将布尔值更改为true时 package myClass; import java.awt.Dimension; import java.aw

我基本上是在做一个tic-tac-toe游戏,使用AI和所有工具,我的系统是绘制按钮,并为每个按钮分配一个布尔值,如果它被X占据,则分配为true,如果它为空,则分配为false。它绘制到正确的大小和布局,除了在我的动作侦听器中,它给了我错误:

编辑:删除了总决赛,仍然给出了错误

“无法分配最终局部变量,因为它是在 封闭类型。”

将按钮文本指定给“x”后,将布尔值更改为true时

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
    }


}

有两个问题。第一,不能修改最终变量。第二,必须使用final变量在监听器中具有作用域。这段代码需要认真重构。然而,这里有一个需要最少干预的快速解决方案

  • 删除所有的
    布尔值;布尔tmid变量

  • 将此枚举添加到main()方法定义之外

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

  • 在适当的位置添加此定义

    // 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);
    }
    

  • 您收到的错误将被消除。

    是的,final变量(例如,
    final boolean-tleft
    )是final的,在初始化后可能不会被修改。您认为
    final
    是什么意思?我对java非常了解,所以我不知道的任何事情(这是很多,我必须在这里学习很多JFrame的工作原理)我不得不用谷歌搜索。我得到一个错误“此行有多个标记-令牌上的语法错误”(“,;预期-令牌上的语法错误”),;预期-void是变量mouseClicked的无效类型“这是我的代码”。错误出现在第58行@JakeHenderson,您可能已经克服了错误,但是在原始代码中,例如,
    topLeft.addMouseListener(new java.awt.event.MouseAdapter(){…}
    。在每个
    addMouseListener
    条目中,您需要按照我的建议添加
    public void mouseClicked
    。但是,对于每个条目,您都需要修改
    ESide.tleft
    以匹配特定的方块。如果您还有其他问题,请开始新的问题。
        public void mouseClicked(java.awt.event.MouseEvent evt)
        {
            if (board.get(ESide.tleft).booleanValue() == false) {
                topLeft.setText("X");
                board.put(ESide.tleft, true);
            }
        }