gpt4 book ai didi

java - 单击按钮时不执行方法 [JavaFX]

转载 作者:行者123 更新时间:2023-11-29 04:35:00 25 4
gpt4 key购买 nike

我正在开发我的第一个 JavaFX 应用程序,它是一个井字游戏。除了按钮,我已经让一切正常工作。单击按钮时,应调用 checkTurn() 方法和 checkState() 方法。 checkTurn() 方法显示 XO,具体取决于它是 是否轮到 X。 checkState() 方法,检查是否有玩家获胜或平局,然后显示新阶段。

但是,checkState() 方法将不起作用。我想知道它是否无法实例化新阶段,因此出于调试目的,我用打印语句替换了实例化,但它也不起作用。我得出的结论是该方法甚至没有被调用。

在寻找修复程序时,我偶然发现了其他一些 Tic Tac Toe 程序,结果发现我的方法在任何方面都没有错。我似乎无法弄清楚为什么没有调用 checkState() 方法。

这是我的代码(按类名排列):

注意:除了 Main.java 之外的所有类都在一个名为“model”的文件夹中,我在 Tiles.java 中放了一个大注释来告诉你“checkState()”方法在哪里.

主要.java:

package com.frixoe;

import com.frixoe.model.Window;
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

public static void main(String[] args) {
launch(args);
}

@Override
public void start(Stage window) throws Exception {
Window gameScreen = new Window();

window.setScene(new Scene(gameScreen));
window.setTitle("Tic Tac Toe");
window.setResizable(false);
window.show();
}
}

窗口.java:

package com.frixoe.model;

import javafx.geometry.Pos;
import javafx.scene.control.Button;
import javafx.scene.layout.GridPane;

public class Window extends GridPane {
private final int HEIGHT = 600;
private final int WIDTH = 600;
private Tiles tiles;

public Window() {
setPrefSize(WIDTH, HEIGHT);
setAlignment(Pos.CENTER);

this.tiles = new Tiles();

placeTiles();
}

private void placeTiles() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Button tile = this.tiles.getTiles()[i][j];
setConstraints(tile, j, i);
getChildren().add(tile);
}
}
}
}

瓷砖.java:

package com.frixoe.model;

import javafx.application.Platform;
import javafx.scene.control.Button;
import javafx.scene.layout.StackPane;
import javafx.scene.text.Font;

public class Tiles extends StackPane {
private boolean isTurnX = true;
private Button[][] tiles = new Button[3][3];
private Font helvetica = new Font("Helvetica", 70);

public Button[][] getTiles() {
generateTiles();
return this.tiles;
}

private void generateTiles() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
Button newBtn = new Button("");
newBtn.setFont(helvetica);
newBtn.setPrefSize(600 / 3, 600 / 3);
newBtn.setOnAction(event -> {
checkTurn(newBtn);
checkState(); // <================================THIS METHOD
});
this.tiles[i][j] = newBtn;
}
}
}

private void checkState() {
if (hasWon("X")) {
new AlertBox("Yay! Player X has Won!", "X Won!");
} else if (hasWon("O")) {
new AlertBox("Yay! Player O has Won!", "O Won!");
} else if (isFull()) {
new AlertBox("It's a draw!", "Draw!");
}
}

private boolean isFull() {
for (int i = 0; i < 3; i++) {
for (int j = 0; j < 3; j++) {
if (this.tiles[i][j].getText().equalsIgnoreCase("")) {
return false;
}
}
}
return true;
}

private boolean hasWon(String player) {
for (int i = 0; i < 3; i++) {
if (tiles[i][0].getText().equalsIgnoreCase(player)
&& tiles[i][1].getText().equalsIgnoreCase(player)
&& tiles[i][2].getText().equalsIgnoreCase(player)) {
return true;
}
}

for (int i = 0; i < 3; i++) {
if (tiles[0][i].getText().equalsIgnoreCase(player)
&& tiles[1][i].getText().equalsIgnoreCase(player)
&& tiles[2][i].getText().equalsIgnoreCase(player)) {
return true;
}
}

return tiles[0][0].getText().equalsIgnoreCase(player)
&& tiles[1][1].getText().equalsIgnoreCase(player)
&& tiles[2][2].getText().equalsIgnoreCase(player);
}

private void checkTurn(Button btn) {
if (isTurnX) {
drawO(btn);

isTurnX = false;
} else {
drawX(btn);

isTurnX = true;
}
}

private void drawX(Button btn) {
btn.setText("X");
}

private void drawO(Button btn) {
btn.setText("O");
}
}

另一个注意事项:AlertBox 类是另一个阶段,它会在玩家获胜或平局时出现。

谢谢你的帮助!

JDK: jdk1.8.0_121

系统:Windows 10 32 位。

IDE:IntelliJ IDEA 2016.3.3

最佳答案

请注意,每次调用 getTiles 都会重新生成磁贴,因此每个按钮都有 9 个副本。这意味着虽然每个按钮都可以设置自己的文本,但它们都只能“看到”最后一组九个按钮(由最后一次调用 getTiles 创建)。

确保您只创建一次您的瓷砖 - 通过在 Tiles 的构造函数中生成它们,或者通过在 中调用 generateTiles 之前检查它们是否已经初始化>获取瓷砖

关于java - 单击按钮时不执行方法 [JavaFX],我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42024100/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com