如何获取我的程序中单击的每个按钮的索引?

2023-12-11

所以我有一个双按钮数组。单击按钮后,我需要能够获取它的索引以用于进一步编码(这是一个类似扫雷的游戏)。这是我到目前为止的代码。我有一个双 for 循环来为每个按钮创建一个 Handle 事件,但我不知道如何获取每个按钮的索引。我尝试过 e.getSource() 但它只返回无用的地址。我尝试为每个按钮提供一个 ID,但它只接受字符串。我不知道下一步该做什么。

import javafx.application.Application;
import javafx.application.Platform;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.VBox;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.Random;



public class main extends Application {


Button[][] tiles = new Button[8][8];
Integer[][] mine_field = new Integer[8][8];
Stage window;



public void start(Stage primaryStage){

    BorderPane Field = new BorderPane();
    HBox Start_Show = new HBox(50);
    Button Start = new Button("Start");
    Button Show = new Button ("Show");
    Start.setStyle("-fx-font-size: 15.5pt;");
    Show.setStyle("-fx-font-size: 15.5pt;");
    Start_Show.getChildren().addAll(Start, Show);
    Start_Show.setAlignment(Pos.CENTER);
    Start_Show.setPadding(new Insets(10,10,10,10));
    Field.setTop(Start_Show);



    tiles = create_tiles(tiles);

    int i;
    int j;

    VBox columns = new VBox();

    for(i=0; i<8; i++){
        HBox row = new HBox();
        for(j=0; j<8; j++){
            row.getChildren().add(tiles[i][j]);
        }
        columns.getChildren().add(row);
    }
    columns.setAlignment(Pos.CENTER);
    columns.setPadding(new Insets(0,0,0,100));

    Field.setCenter(columns);



    mine_field = set_mines(mine_field);

    Start.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
             start(primaryStage);               
        }

    });

    Show.setOnAction(new EventHandler<ActionEvent>() {
        @Override
            public void handle(ActionEvent e){

                int i = 0;
                int j = 0;

                for(i=0; i<8; i++){
                    for(j=0; j<8; j++){

                        if(mine_field[i][j] == 1) {
                            tiles[i][j].setStyle("-fx-font-size: 15.5pt;");
                            tiles[i][j].setTextFill(Color.RED);
                            tiles[i][j].setMaxHeight(150);
                            tiles[i][j].setMaxWidth(251);
                            tiles[i][j].setText("M");   
                            }
                        }
                    }
                }
            });



    for(i=0; i<8; i++){

        for(j=0; j<8; j++){
            Tile_Handler tile_handle = new Tile_Handler();
            tiles[i][j].setOnAction(tile_handle);
        }
    }





    Scene scene = new Scene(Field, 600, 600);
    primaryStage.setTitle("MineSweeper!");
    primaryStage.setScene(scene);
    primaryStage.show();


}


public Button[][] create_tiles(Button[][] array){

    int i;
    int j;

    for(i=0; i<8; i++){

        for(j=0; j<8; j++){
            Button my_butt = new Button("?");
            my_butt.setStyle("-fx-font-size: 20pt;");
            my_butt.prefWidthProperty();

            array[i][j] = my_butt;

        }
    }

    return array;

}

public Integer[][] set_mines(Integer[][] array){
    Random random = new Random();

    int i;
    int j;
    int k;

    for(i=0; i<8; i++){

            for(j=0; j<8; j++){
                array[i][j] = 0;

            }
        }

    for(i=0; i<10; i++){
        j = random.nextInt(8);
        k = random.nextInt(8);
        array[j][k] = 1;            
    }

    return array;
}


class Tile_Handler implements EventHandler<ActionEvent> {

    public void handle(ActionEvent e){




        System.out.println("yo clicked one button located at ");
    }
}



public static void main(String[] args){

        Application.launch(args);

}







}

您可以使用参数、实用函数和 lambda 表达式动态创建图块处理程序:

private EventHandler<ActionEvent> createTileHandler(int x, int y) {
    return event -> tileHandler(x, y);
}
private void tileHandler (int x, int y){
    System.out.println(String.format("Clicked tile at (%d,%d)", x, y));
}

然后应用到不同的按钮,如下所示:

 ... 

for (int i=0; i<8; i++){
    for (int j=0; j<8; j++) {
        tiles[i][j].setOnAction(createTileHandler(i, j));
    }
}

...

或者,修改当前的解决方案,您可以添加两个成员Tile_Handler,因此在创建它时将其附加到特定坐标:

class Tile_Handler implements EventHandler<ActionEvent> {

    private int x, y;

    public Tile_Handler(int x, int y) {
        this.x = x;
        this.y = y;
    }

    public void handle(ActionEvent e){

        System.out.println(String.format("yo clicked one button located at %d,%d",x,y));
    }
}

然后将实例化更改为

Tile_Handler tile_handle = new Tile_Handler(i, j);
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何获取我的程序中单击的每个按钮的索引? 的相关文章

随机推荐

  • 有没有什么好的方法来加密C#桌面应用程序[重复]

    这个问题在这里已经有答案了 可能的重复 保护 NET 代码免遭逆向工程 我们只是用C winforms开发一个应用程序 有什么好的加密方法可以帮助我们防止盗版吗 我看到有些软件可能需要硬件支持来保护其软件 如何实现 提前致谢 好吧 你在这里
  • 不读取模型[关闭]

    Closed 这个问题需要调试细节 目前不接受答案 我正在用Python编写一个程序 我想连接GPT4ALL 以便该程序像GPT聊天一样工作 仅在我的编程环境中本地运行 为此 我已经安装了 GPT4All 13B snoozy ggmlv3
  • 在 javascript 警报中编写 php

    我用以下方式在JS中编写PHP alert echo Error login 关联一个xml 用symfony翻译成两种语言 但现在不起作用 我该如何解决 您缺少引号alert call alert
  • Ruby on Rails - 将模型中的字段添加到另一个模型的表单上

    我有两个型号Contract and Addendum 合同has many addendums和附录belongs to contract 创建新合同时 将自动创建新的附录 但需要一些额外的元素来创建新的附录 如何添加字段value 这是
  • Pandas 中的顺序组内枚举

    假设我有以下数据框 date A B C D 0 2014 03 20 1 561714 0 979202 0 454935 0 629215 1 2014 03 20 0 390851 0 045697 1 683257 0 771027
  • 将引用(工具>引用)与 VBA 代码(宏)连接

    我想使用 VBA 代码以编程方式将一些引用连接到我的 VBA 项目 即无需使用 工具 gt 引用 手动设置引用 这可能吗 例如 Microsoft Office 12 0 对象库 您没有提到 Office 应用程序 在 MS Access
  • 使用 malloc 时出错

    I pass char input from main to processInExp 函数 然后我再次传递它processInExp 功能为getInput 函数在读取文件时动态分配它 Inside getInput 功能input检查时
  • 为什么 ASP.NET 网站没有 Designer.cs?

    如果我们在 Visual Studio 中创建 ASP NET Web 应用程序 我们可以看到每个 aspx 文件都会有一个关联的自动生成的 aspx designer cs 文件 但对于 ASP NET 网站 每个 aspx 文件只有一个
  • 如何屏蔽具有 RepeatVector() 层的 LSTM 自动编码器中的输入?

    我一直在尝试使用 LSTM 自动编码器获取向量序列的向量表示 以便我可以使用 SVM 或其他此类监督算法对序列进行分类 数据量阻止我使用完全连接的密集层进行分类 我的输入的最短大小是 7 个时间步长 最长的序列是 356 个时间步长 因此
  • _vscprintf 在 Android 上等效吗?

    vscprintf在 Android 上不可用 还vsprintf NULL fmt ap 不起作用 产生段错误 因此似乎无法计算 vsnprintf 成功所需的缓冲区大小 Android sources表明 android log pri
  • “304 Not Modified”到底是如何工作的?

    304 Not Modified 响应是如何生成的 浏览器如何判断HTTP请求的响应是否为304 是浏览器设置的还是服务器发送的 如果由服务器发送 服务器如何知道缓存中可用的数据 以及如何将304设置为图像 我的猜测 如果它是由浏览器生成的
  • Git pre-commit hook:使用 -a 标志提交时如何获取添加/修改的文件

    当我使用 git commit a 提交我的工作时 预提交挂钩中的 git diff diff filter ACM name only cached 无法获取 git 将添加的文件 那么对于这种情况 正确的解决方案是什么 这里的问题是gi
  • 如何禁用/启用对话框负积极按钮?

    请查看下面的自定义对话框 我在对话框上有一个编辑文本字段 如果文本字段为空 我想禁用positiveButton 我可以为文本字段获取 charListener 但我不确定如何设置positivebutton禁用或启用该侦听器 正负按钮的参
  • Apache Flink:如何在摄取时间模式下获取事件的时间戳?

    我想知道是否可以使用Flink的摄取时间模式来获取记录的时间戳 考虑以下 flink 代码示例 https github com apache flink blob master flink examples flink examples
  • 在启用安全管理命令后,Glassfish 5 将无法启动

    输入enable secure admin 命令后 我无法运行 Glassfish 5 我有明确的操作系统 Ubutntu 服务器 16 04 然后我安装 java 8 并下载 zip 文件中的 glassfish 服务器 可能是什么问题呢
  • 如何使用 Graph-API 在 Facebook 中搜索特定位置的所有用户

    我有一个项目 我必须在 Facebook 上搜索所有人 特定位置 然后对数据应用进一步的过滤器 我的问题和问题是 如何使用 Graph API 获取初始数据 我知道这是可能的 使用 Facebook 本身的搜索字段 只需输入 所有居住在 的
  • 如何使用表面视图在用户不知情的情况下捕获图像?

    我想从 Android 相机捕获图像 但用户不知情 public class Capture extends Activity public Uri fileUri public String filepath1 public static
  • doGet 方法完成后 Servlet 是否返回响应?

    显然 doGet方法的返回类型为 void 因此 它不返回任何内容 从这个意义上说 我使用 返回 一词来表示将响应发送回请求它的客户端 我正在尝试实现一个长轮询 Servlet 在我有想要发回的内容之前不发送响应是有益的 因此 在 doGe
  • 我怎样才能让它在 android/iphone 上播放视频?

    update 1 我不太了解 但我想做的是通过 html5 在 android 手机上播放视频 正如其他人所说 我必须使用标签才能做到这一点 结束更新1 updated 这是我的 html 页面上的代码
  • 如何获取我的程序中单击的每个按钮的索引?

    所以我有一个双按钮数组 单击按钮后 我需要能够获取它的索引以用于进一步编码 这是一个类似扫雷的游戏 这是我到目前为止的代码 我有一个双 for 循环来为每个按钮创建一个 Handle 事件 但我不知道如何获取每个按钮的索引 我尝试过 e g