JavaFX:如何在gridpane中获取列和行索引?
单击时,我试图获取gridpane的行/列索引 我正在寻找类似JTable(JavaSwing)中的方法 我搜索了这个 但这对我没有帮助。因为它需要节点名称来获取行/列索引 我制作了一个语法网格组件。所以节点名是相同的。 我怎样才能得到这个值?我的部分代码如下JavaFX:如何在gridpane中获取列和行索引?,javafx,Javafx,单击时,我试图获取gridpane的行/列索引 我正在寻找类似JTable(JavaSwing)中的方法 我搜索了这个 但这对我没有帮助。因为它需要节点名称来获取行/列索引 我制作了一个语法网格组件。所以节点名是相同的。 我怎样才能得到这个值?我的部分代码如下 for (int i = 0; i < imageName.length; i++) { try { img = new Image(getClass().getResourceAsStream(imageName
for (int i = 0; i < imageName.length; i++) {
try {
img = new Image(getClass().getResourceAsStream(imageName[i]));
} catch (Exception e) {
System.out.println("exception : " + e);
}
ImageView imageview = new ImageView(img);
imageview.setFitWidth(40);
imageview.setFitHeight(40);
HBox hbox= new HBox();
hbox.getChildren().add(imageview);
tile1.setHgap(40);
tile1.setVgap(40);
tile1.add(hbox, i+2, 0);
}
for(int i=0;i
下面是一个示例,说明如果您只想在网格窗格上使用鼠标侦听器,而不想在单元格中的节点上使用鼠标侦听器,您可以如何执行此操作。为了简单起见,我使用了一个标签作为单元节点,但您可以使用任何您喜欢的
public class Demo extends Application {
public static void main(String[] args) {
Application.launch(args);
}
@Override
public void start(final Stage primaryStage) {
Pane root = new Pane();
GridPane gridPane = new GridPane();
gridPane.setGridLinesVisible(true);
for (int i = 0; i < 5; i++) {
for (int j = 0; j < 5; j++) {
Label label = new Label("Label " + i + "/" + j);
label.setMouseTransparent(true);
GridPane.setRowIndex(label, i);
GridPane.setColumnIndex(label, j);
gridPane.getChildren().add(label);
}
}
root.getChildren().add( gridPane);
Scene scene = new Scene(root, 400, 300, Color.WHITE);
primaryStage.setScene(scene);
primaryStage.show();
gridPane.addEventFilter(MouseEvent.MOUSE_PRESSED, new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent e) {
for( Node node: gridPane.getChildren()) {
if( node instanceof Label) {
if( node.getBoundsInParent().contains(e.getSceneX(), e.getSceneY())) {
System.out.println( "Node: " + node + " at " + GridPane.getRowIndex( node) + "/" + GridPane.getColumnIndex( node));
}
}
}
}
});
}
}
但是请注意,只有在数据之前已设置的情况下(如这些方法的文档中所指定),和方法才起作用
我不知道您打算实现什么,但就个人而言,我更喜欢使用节点本身,而不是布局管理器中可能发生变化的一些索引。正如@Roland指出的,您还可以为每个节点分配一个侦听器。执行此操作时,您可以使用此方法的单个回调方法(例如,鼠标按下的处理程序,但也适用于其他处理程序): 将处理程序分配给节点。假设您有一组按钮:
for (Button button : buttons) {
button.setOnMousePressed(this::onPress);
}
void onPress(MouseEvent event) {
int column = GridPane.getColumnIndex((Node) event.getSource());
int row = GridPane.getRowIndex((Node) event.getSource());
System.out.println(String.format("Node clicked at: column=%d, row=%d", column, row));
}
鼠标按下处理程序方法:
for (Button button : buttons) {
button.setOnMousePressed(this::onPress);
}
void onPress(MouseEvent event) {
int column = GridPane.getColumnIndex((Node) event.getSource());
int row = GridPane.getRowIndex((Node) event.getSource());
System.out.println(String.format("Node clicked at: column=%d, row=%d", column, row));
}
哇!完美的非常感谢!:)“我没有关于您打算实现什么的信息,但就我个人而言,我更喜欢使用节点本身,而不是布局管理器中可能发生变化的一些索引。”我该如何做到这一点?我通常只将每个
节点
存储在一个单独的2D数组中,并从那里引用它。“处理节点本身”是什么意思?