JavaFX:在 GridPane 单击更新 ImageView

标签 java javafx mouseevent gridpane

我正在使用 JavaFX 开发扫雷游戏:

(On game start)

我的 GridPaneImageViews 组成,我试图找到一种方法来找出在 网格面板。我目前有这段代码:

gameGrid.setOnMouseClicked(event -> //gameGrid is my GridPane
{
    Node source = (Node)event.getSource();
    int columnIndex = GridPane.getColumnIndex(source);
    System.out.println(columnIndex);
    int rowIndex = GridPane.getRowIndex(source);
    if(event.getButton()== MouseButton.PRIMARY)
    game.newRevealCell(columnIndex,rowIndex);
    else if(event.getButton()==MouseButton.SECONDARY)

    game.getGrid()[columnIndex][rowIndex].setFlagged(true);
    //game.getGrid is a 2D array containing the game cells

});

但是,方法 getColumnIndexgetRowIndex 返回 null。我做错了什么?

最佳答案

为@trashgod 提供的所有评论和答案+1。

但是为了解决您的实际问题,我认为使用 event.getSource 是您问题的根本原因。从事件返回的源将始终是 GridPane。

event.getTarget() 方法将为您提供您单击的目标节点。所以我认为将其更改为 getTarget() 将解决您的问题。

下面是我的意思的工作演示。 即使我没有明确设置索引约束,这也能工作

更新: 我误以为显式约束设置只能通过 GridPane.add 方法完成。但是使用 add/addRow/addColumn 方法也会设置索引约束。

注意:如果您单击的目标节点是 GridPane 的直接子节点(在您的情况下),这将起作用。但是,如果您的目标节点不是 GridPane 的直接子节点,例如如果 StackPane 有一个标签,并且如果您单击该标签,则会抛出空异常。

import javafx.application.Application;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;

public class GridPaneIndexingDemo extends Application {
    @Override
    public void start(Stage stage) throws Exception {
        StackPane root = new StackPane();
        Scene scene = new Scene(root, 450, 450);
        stage.setScene(scene);
        stage.setTitle("GridPane");
        stage.show();

        GridPane grid = new GridPane();
        grid.setGridLinesVisible(true);
        grid.addRow(0, getPane(1), getPane(2), getPane(3));
        grid.addRow(1, getPane(4), getPane(5), getPane(6));
        grid.addRow(2, getPane(7), getPane(8), getPane(9));
        grid.setOnMouseClicked(event -> {
            Node source = (Node) event.getTarget();
            int columnIndex = GridPane.getColumnIndex(source);
            int rowIndex = GridPane.getRowIndex(source);
            System.out.println("Row : " + rowIndex + ", Col : " + columnIndex);
        });
        root.getChildren().add(grid);
    }

    private StackPane getPane(int i) {
        String[] colors = {"grey", "yellow", "blue", "pink", "brown", "white", "silver", "orange", "lightblue", "grey"};
        StackPane pane = new StackPane();
        pane.setPrefSize(150,150);
        pane.setStyle("-fx-background-color:" + colors[i] + ";-fx-border-width:2px;");
        return pane;
    }

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

关于JavaFX:在 GridPane 单击更新 ImageView,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/69429420/

相关文章:

java - 如何将多个 MouseListener 添加到单个 JFrame?

javascript - 创建动态 Two.js 变量以涉及单个点击事件

javascript - Mousemove 事件未在页面元素或文档上触发

java - 带有淡入淡出 ImageView 动画的启动画面

java - 未知输入字节长度转换为 int

java - 反编译Java项目并编译

JavaFX 8 工具提示消除了舞台的透明度

java - 按下按钮使微调器在另一个屏幕上可见

java - 如果响应未在 java 中返回,如何跳过循环

java - android :weight in JavaFX的对应