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