当前位置: 首页 > 知识库问答 >
问题:

按下按钮时访问变量

爱唯
2023-03-14

我正在使用javafx编写一个小型棋盘游戏,我已经为棋盘上的每个“单元格”创建了一个网格。

但是,在按下单元格按钮时,我在更改单元格颜色时遇到了一些问题。

下面是我得到的一个错误:“Error:(44,43) java:从内部类引用的局部变量必须是final或有效的final”

但是,我不能将变量设为final——因为变量是for循环的一部分,如下所示:

for (int columns = 0; columns < 8; columns++) {
        for (int rows = 0; rows < 8; rows++) {
            positions[columns][rows] = new Button();

            positions[columns][rows].setText("X:" + columns + " Y:" + rows); // current location text (temp)

            positions[columns][rows].setMinHeight(cellDimensions);
            positions[columns][rows].setMaxHeight(cellDimensions);
            positions[columns][rows].setMinWidth(cellDimensions);
            positions[columns][rows].setMaxWidth(cellDimensions);

            String zoneColour = getColourBoard(columns, rows);
            positions[columns][rows].setStyle("-fx-background-color: " + zoneColour + "; ");

            positions[columns][rows].setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent event) {
                            positions[columns][rows].setStyle("-fx-background-color: #FFA500; ");
                        }
                    });

            grid.add(positions[columns][rows], columns, rows);

        }
    }

这里真正的问题是,我需要向作为按钮数组一部分的按钮添加一个事件处理程序,但是似乎不能访问所述按钮数组的计数器变量。

共有3个答案

丁灿
2023-03-14

如果问题是关于句柄方法中的位置[列][行]引用,您可以尝试用event.getSource()替换它,将其转换为正确的类型,以删除对其中位置的引用。

赵鸿畴
2023-03-14

最简单的方法是在每次迭代时立即将循环计数器设置为最终变量。

for (int columns = 0; columns < 8; columns++) {
    final int columnNum = columns;
    for (int rows = 0; rows < 8; rows++) {
        final int rowNum = rows;
        // now use columnNum and rowNum
    }
}
羿宏硕
2023-03-14

您之所以会遇到这个问题,是因为在整个循环中都会发生变化。您可以创建这些的最终实例,但创建一个<code>最终按钮</code>以在侦听器中引用更有意义。

for (int columns = 0; columns < 8; columns++) {
    for (int rows = 0; rows < 8; rows++) {
        positions[columns][rows] = new Button();
        positions[columns][rows].setText("X:" + columns + " Y:" + rows); // current location text (temp)
        positions[columns][rows].setMinHeight(cellDimensions);
        positions[columns][rows].setMaxHeight(cellDimensions);
        positions[columns][rows].setMinWidth(cellDimensions);
        positions[columns][rows].setMaxWidth(cellDimensions);

        String zoneColour = getColourBoard(columns, rows);
        positions[columns][rows].setStyle("-fx-background-color: " + zoneColour + "; ");

        final Button b = positions[columns][rows];
        // final int c = columns, r = rows;
        positions[columns][rows].setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent event) {
                // Could use c and r above if needed.
                // positions[c][r]
                b.setStyle("-fx-background-color: #FFA500; ");
            }
        });
        grid.add(positions[columns][rows], columns, rows);
    }
}
 类似资料:
  • 我以编程方式生成了许多按钮(一些按钮用于增加值,而另一些按钮用于减少值),当它们调整的值达到最大值或最小值时,我会禁用这些按钮。(即,当达到最大值时,“增加”按钮被禁用,而当达到最小值时,“减少”按钮被禁用。)除了禁用,我还将按钮状态设置为“按下”,以直观地指示已达到极限值,并且按钮不再工作。 我的按钮onClickListener的'增加'按钮看起来像这样: ClickListeners上相应的

  • } 完整错误消息:

  • 所以我有这些按钮(3叠6个,18个),我想实现的是当我按下其中一个按钮时: > 边框颜色 其他按钮将重置为其正常样式 但是我不想通过“isEnable”技巧禁用其他的(我只在这里找到了涉及isEnable的解决方案),我仍然希望它们被启用,我只是希望它们不要在按下时被我的自定义样式“突出显示”。 对于第一部分,也就是我在IBAction中所做的造型: 这一小部分只是一个按钮,但我想如果我有18个按

  • 我是一个新手,我正在尝试创建一个应用程序来在我的投资组合中使用。本质上,该程序是一个可以访问不同菜单的菜单(json文件:texas_pick.js,Breakth.js…),该程序旨在以按钮的形式显示菜单选项,按钮的详细信息从各自的json文件中检索。我面临的问题是,单击菜单选项时,会检索最后一个菜单项的数据。我将后端编程为只将商品名称和价格推送到数据库,而前端则检索这些数据并将其显示在表上。检

  • 问题内容: 下面的代码正确返回该单元格: 但是在表视图中查找indexpath会崩溃: 我尝试了另一种方法,但是没有成功: 问题答案: 我不知道是否有简单的方法可以做到这一点。( 编辑: 实际上有。请查看@mustafa的第二个解决方案。)一种解决方法是将按钮的标签设置为in ,然后可以仅访问按钮的标签以找出按钮所属的行。 警告: 此解决方法很脆弱。如果您允许在不调用的情况下从表中添加或删除行,则

  • 问题内容: 我有这个代码 它的工作原理,但不是我所期望的。声音会播放,但仅在我每次按下按钮时播放。我的主意是 当我按下按钮时,声音会播放,当我停止动作(手指在按钮之外)时,音乐会暂停。 有什么想法吗? 谢谢 问题答案: 这应该可以工作(我认为您的开关柜出了点问题):