我正在使用 JavaFX 开发扫雷游戏:
我的 GridPane
由 ImageViews
组成,我试图找到一种方法来找出在 网格面板
。我目前有这段代码:
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
});
但是,方法 getColumnIndex
和 getRowIndex
返回 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/