JAVA TextArea 等待输入

标签 java javafx

我有一个基于两个文本区域的井字游戏(ta1 用于输入(标记位置),ta2 用于网格输出)。 player_input() 不起作用,因为它从 ta1 中获取空文本。如何让ta1等待输入并按ENTER键然后返回位置?我相信整个程序因此而崩溃。

import extendsFX.BaseApps;
import extendsFX.BaseConsole;
import extendsFX.BaseGraphics;
import static extendsFX.BaseApps.nL;
import java.awt.RenderingHints;
import static javafx.application.Application.launch;
import javafx.scene.control.TextField;
import javafx.stage.Stage;
import java.awt.event.KeyEvent;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;

public class tictactoe extends BaseConsole{

    void display_board(char[] board){
        ta2.appendText("   |   |   " +nL);
        ta2.appendText(" " + board[7] + " | " + board[8] + " | " + board[9] + " "+nL);
        ta2.appendText("   |   |   "+nL);
        ta2.appendText("-----------"+nL);
        ta2.appendText("   |   |   "+nL);
        ta2.appendText(" " + board[4] + " | " + board[5] + " | " + board[6] + " "+nL);
        ta2.appendText("   |   |   "+nL);
        ta2.appendText("-----------"+nL);
        ta2.appendText("   |   |   "+nL);
        ta2.appendText(" " + board[1] + " | " + board[2] + " | " + board[3] + " "+nL);
        ta2.appendText("   |   |   "+nL);
    }

    boolean is_over(char[] board){
        if (board[1] == board[2] && board[2] == board[3] && board[1] != ' ' && board[2] != ' ' && board[3] != ' ')
            return true;
        else if(board[4] == board[5] && board[5] == board[6] && board[4] != ' ' && board[5] != ' ' && board[6] != ' ')
            return true;
        else if(board[7] == board[8] && board[8] == board[9] && board[7] != ' ' && board[8] != ' ' && board[9] != ' ')
            return true;
        else if(board[1] == board[4] && board[4] == board[7] && board[1] != ' ' && board[4] != ' ' && board[7] != ' ')
            return true;
        else if(board[2] == board[5] && board[5] == board[8] && board[2] != ' ' && board[5] != ' ' && board[8] != ' ')
            return true;
        else if(board[3] == board[6] && board[6] == board[9] && board[3] != ' ' && board[6] != ' ' && board[9] != ' ')
            return true;
        else if(board[1] == board[5] && board[5] == board[9] && board[1] != ' ' && board[5] != ' ' && board[9] != ' ')
            return true;
        else if(board[3] == board[5] && board[5] == board[7] && board[3] != ' ' && board[5] != ' ' && board[7] != ' ')
            return true;
        return false;
    }

    void place_marker(char[] board, char marker, int position){
        if (board[position] == ' ')
            board[position] = marker;
        else
            ta2.appendText("Position is already taken! Please choose another spot"+nL);
            while(true) {
                int loc = player_input();
                if (board[loc] == ' ')
                {
                    board[loc] = marker;
                    break;
                }
            }
    }

    int player_input(){
        ta2.appendText("Location: " + nL);
        int location = Integer.parseInt(ta1.getText());
        return location;
    }

    boolean is_full(char[] board){
        for(int n = 1; n < 10; n++){
            if (board[n] == ' ')
                return false;
        }
        return true;
    }

    boolean check_for_draw(char[] board){
        if(is_over(board) == false && is_full(board) == true){
            ta2.appendText("Draw!"+nL);
            return true;
        }
        return false;
    }

    char[] board = {' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' ', ' '};
    char[] board_test = {'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X', 'X'};

//    public void TextArea1KeyPressed(KeyEvent evt, int input1)
//    {
//        if (evt.getKeyCode() == KeyEvent.VK_ENTER)
//            {
//                input1 = player_input();
//            }
//    }

    @Override
    public void createControls() {

        super.createControls()
    }
    @Override
    public void start(Stage stage) throws Exception {
        stage.setTitle("TicTacToe");
        super.start(stage);
        //display_board(board_test);

        while(true){
            //Player1 turn
            ta2.appendText("Player1's turn:"+nL);
            int input1 = 0;

            place_marker(board, 'X', input1);
            ta2.clear();
            display_board(board);
            if (is_over(board) == true){
                ta2.appendText("Player 1 won!"+nL);
                break;
            }
            if(check_for_draw(board) == true)
                break;

            //Player2 turn
            ta2.appendText("Player2's turn:"+nL);
            int input2 = player_input();
            place_marker(board, 'O', input2);
            ta2.clear();
            display_board(board);
            if (is_over(board) == true){
                ta2.appendText("Player 2 won!"+nL);
                break;
            }
            if(check_for_draw(board) == true)
                break;
        }
    }
    public static void main(String[] args) {
        launch();

    }
}

最佳答案

这是处理您的问题的一种方法的粗略示例。首先,您的 displayBoard() 方法将抛出 IndexOutOfBounds 错误。我猜你的棋盘尺寸是 9,这使得 board[9] 超出范围。请记住,Java 中的数组 是从零开始索引的。这意味着最后一个索引是数组大小 - 1. 回到问题 -> 该程序允许用户输入一个数字并按 Enter 键。然后,它使用该数字将 XO 放置在板上的该位置。请记住,数组是从零开始索引的,因此如果您希望用户能够输入 1 到 9 之间的数字,则程序必须从输入的每个数字中减去 1。此代码中的 Listener 可能正是您解决问题所需要的。它监听输入 TextArea

中输入的内容
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.TextArea;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author blj0011
 */
public class JavaFXApplication374 extends Application
{
    TextArea taInput = new TextArea();
    TextArea taBoard = new TextArea();
    char[] currentBoardState = new char[9];
    char turn;

    @Override
    public void start(Stage primaryStage)
    {
        taBoard.setEditable(false);//Don't allow user to alter board
        turn = 'X';//Set who is going first X or O.

        //Set all the character to empty space.
        for (int i = 0; i < currentBoardState.length; i++) {
            currentBoardState[i] = ' ';
        }

        displayBoard(currentBoardState);//Display initial board.

        VBox root = new VBox(taInput, taBoard);//Add input and board to the scene.

        //Use listener to update board state
        taInput.setOnKeyReleased((event) -> {
            if (event.getCode() == KeyCode.ENTER) {
                String[] tempInput = taInput.getText().split("\n");
                for (int i = 0; i < tempInput.length; i++) {
                    currentBoardState[Integer.parseInt(tempInput[i]) - 1] = turn;//Change the 0 based array to a 1 based array.
                    //Switch turn to other player
                    if (turn == 'X') {
                        turn = 'O';
                    }
                    else {
                        turn = 'X';
                    }
                }

                displayBoard(currentBoardState);//display board after update.
            }
        });
        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Hello World!");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    public void displayBoard(char[] board)
    {
        StringBuilder boardString = new StringBuilder();
        boardString.append(board[6]).append(" | ").append(board[7]).append(" | ").append(board[8]).append(System.lineSeparator())
                .append("----------").append(System.lineSeparator())
                .append(board[3]).append(" | ").append(board[4]).append(" | ").append(board[5]).append(System.lineSeparator())
                .append("----------").append(System.lineSeparator())
                .append(board[0]).append(" | ").append(board[1]).append(" | ").append(board[2]).append(System.lineSeparator());

        taBoard.setText(boardString.toString());
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args)
    {
        launch(args);
    }

}

enter image description here 董事会有点偏离,但我并没有追求完美。这更多的是关于编码思想。

关于JAVA TextArea 等待输入,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58301441/

相关文章:

java - 在使用 DFC 的 Documentum 中,我的文件夹迁移不断失败

JavaFX 表格 View 清除集合

java - 定义字符串作为变量,使代码运行得更快

java - Proguard 的哪个优化选项删除了 if() 语句?

java - 用于 Windows 应用程序自动化的良好 Java 库

java - -DskipTests 和 -Dmaven.test.skip=true 有什么区别

java - 如何从apache poi读取word文档中的注释?

JavaFx .Fxml 及其 Controller 类

java - 如何让maven在linux上请求正确的javafx依赖

JavaFX TextField 在焦点上将填充更改为 0