在JavaFX中,如何在网格的每个单元格中输入鼠标上的GridPane行和列ID?

在JavaFX中,如何在网格的每个单元格中输入鼠标上的GridPane行和列ID?,java,javafx,javafx-8,Java,Javafx,Javafx 8,我正在我的应用程序中试用JFX拖放功能(稍后按顺序连接对象)。我找不到任何简单的方法将ImageView/按钮拖放到窗格中合适的位置,因此我计划应用GridPane。GridPane将是一个包含超过(50x50)个单元格的大型画布 如果我在代码中指定需要通过ImageView在(2,2)单元格中拖放,我就可以做到。但是,我需要将该访问权限授予我的用户。用户可以在网格中移动指针,并将ImageView/按钮放置在网格中的任何单元格中 现在,我想找出在GridPane的特定单元格中输入的鼠标单元格的

我正在我的应用程序中试用JFX拖放功能(稍后按顺序连接对象)。我找不到任何简单的方法将ImageView/按钮拖放到窗格中合适的位置,因此我计划应用GridPane。GridPane将是一个包含超过(50x50)个单元格的大型画布

如果我在代码中指定需要通过ImageView在(2,2)单元格中拖放,我就可以做到。但是,我需要将该访问权限授予我的用户。用户可以在网格中移动指针,并将ImageView/按钮放置在网格中的任何单元格中

现在,我想找出在GridPane的特定单元格中输入的鼠标单元格的rowID和columnID

我正在控制器中处理鼠标事件,如下所示:

package sample;

import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.*;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.stage.Stage;

import java.net.URL;
import java.util.ResourceBundle;

public class Controller implements Initializable{
Stage stage;

@FXML
private GridPane gridPane;

public void setStage(Stage primaryStage){
    stage = primaryStage;
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    System.out.println("initialize");
}


@FXML
private void handleMouseEntered(MouseEvent event){
    System.out.println("MouseEntered");
}

}
当进入网格窗格时,我只得到一次“mouseenterned”。此外,我无法获取任何RowID和ColumnID,因此,我没有在函数中编写任何函数

我的界面如下所示:

我想知道两件事:

[]如何在gridpane的每个单元格中检测鼠标项

[]如何找到特定单元格的行和列ID


提前感谢。

您可以通过调用
GridPane.getColumnIndex(节点)
GridPane.getRowIndex(节点)
来获取值

您还没有显示您在网格窗格中放置了什么,甚至没有显示您是用FXML还是Java填充它,但这里有一些基本功能。在这里,我(乏味地)在FXML中填充
GridPane
,根据您的使用情况,最好用Java(即控制器)填充它。(这样,处理程序也会变得更干净一些。)

控制器类:

import javafx.fxml.FXML;
import javafx.scene.Node;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;


public class GridPaneTrackingController {

    @FXML
    private void mouseEntered(MouseEvent e) {
        Node source = (Node)e.getSource() ;
        Integer colIndex = GridPane.getColumnIndex(source);
        Integer rowIndex = GridPane.getRowIndex(source);
        System.out.printf("Mouse entered cell [%d, %d]%n", colIndex.intValue(), rowIndex.intValue());
    }
}
如果您不想在FXML中定义单元格的内容,那么您可以在控制器中定义它们。这使事情变得更清晰,因为您可以在定义侦听器时注册它们:

import javafx.fxml.FXML;
import javafx.scene.layout.ColumnConstraints;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.layout.Priority;
import javafx.scene.layout.RowConstraints;


public class GridPaneTrackingController {

    @FXML
    private GridPane grid ;

    public void initialize() {
        int numCols = 4 ;
        int numRows = 4 ;

        for (int i = 0 ; i < numCols ; i++) {
            ColumnConstraints colConstraints = new ColumnConstraints();
            colConstraints.setHgrow(Priority.SOMETIMES);
            grid.getColumnConstraints().add(colConstraints);
        }

        for (int i = 0 ; i < numRows ; i++) {
            RowConstraints rowConstraints = new RowConstraints();
            rowConstraints.setVgrow(Priority.SOMETIMES);
            grid.getRowConstraints().add(rowConstraints);
        }

        for (int i = 0 ; i < numCols ; i++) {
            for (int j = 0; j < numRows; j++) {
                addPane(i, j);
            }
        }
    }

    private void addPane(int colIndex, int rowIndex) {
        Pane pane = new Pane();
        pane.setOnMouseEntered(e -> {
            System.out.printf("Mouse enetered cell [%d, %d]%n", colIndex, rowIndex);
        });
        grid.add(pane, colIndex, rowIndex);
    }

}

将鼠标侦听器注册到每个单元格中的节点。然后你就知道哪个单元格被输入了。看看这个答案:它部分地涵盖了你的问题。结合@James\u D suggestion,它应该会起作用。@James\u D您建议的方法会起作用!但是,我会有一个大(50x50或更大)的网格。在这里,该方法可能不是最优的。你能建议什么合适的方法吗?谢谢。我不明白为什么用2500个电池做同样的事情会是个问题。“你试的时候出了什么问题?”詹姆斯·哈伊。建议的方法效果很好。但是,我必须分别为每个单元格添加窗格。在SceneBuilder中创建网格并不花费太多时间。因此,我考虑删除添加2500个窗格的手动工作。你能建议如何克服这个问题吗?谢谢。这解决了我的问题。现在我遇到了另一个与处理MouseEvent和DragEvent相关的事件有关的问题,我将提出另一个问题:@James_D我如何用数据库中的内容填充网格窗格?@IsraelMeshileya这到底与这个问题有什么关系?@James_D我很抱歉,我在使用数据库填充网格窗格方面遇到了一个问题,我不介意,如果你能让我了解它的实施原因,@Meshileya不要劫持其他问题。如果你有一个问题还没有回答,那就发一个。在你写问题之前,确保你彻底阅读了,以及类似的问题。
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.layout.GridPane?>

<GridPane xmlns:fx="http://javafx.com/fxml/1" 
    fx:controller="GridPaneTrackingController" 
    fx:id="grid" gridLinesVisible="true">

</GridPane>
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.stage.Stage;

public class GridPaneTrackingExample extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception {
        GridPane root = FXMLLoader.load(getClass().getResource("GridPaneTrackingExample.fxml"));
        primaryStage.setScene(new Scene(root, 800, 800));
        primaryStage.show();
    }

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