gpt4 book ai didi

JavaFX:在 GridPane 单击更新 ImageView

转载 作者:行者123 更新时间:2023-12-01 23:13:12 24 4
gpt4 key购买 nike

我正在使用 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/

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