Java 在这种情况下,如何使setOnMouseDragOver工作?

Java 在这种情况下,如何使setOnMouseDragOver工作?,java,javafx,Java,Javafx,我想做一个战舰游戏 以下是代码的链接: 基本上,当你点击其中一个舰船按钮(战舰、巡洋舰、潜艇等)时,屏幕上会弹出一个矩形。您可以通过单击并拖动鼠标在屏幕上移动此矩形。将所有事件处理程序添加到矩形的类可以在MouseGestures.java类中找到 事件处理程序从第82行开始添加到GameGUI.java类的GridPane中 基本上,我试图在GridPane中找到拖动此对象的任何节点的索引。通过将setOnMouseEnter应用于gridpane中的每个节点,我可以不拖拽地完成这项工作,但是

我想做一个战舰游戏

以下是代码的链接:

基本上,当你点击其中一个舰船按钮(战舰、巡洋舰、潜艇等)时,屏幕上会弹出一个矩形。您可以通过单击并拖动鼠标在屏幕上移动此矩形。将所有事件处理程序添加到矩形的类可以在MouseGestures.java类中找到

事件处理程序从第82行开始添加到GameGUI.java类的GridPane中

基本上,我试图在GridPane中找到拖动此对象的任何节点的索引。通过将setOnMouseEnter应用于gridpane中的每个节点,我可以不拖拽地完成这项工作,但是当我尝试使用setOnMouseDragenter时,我什么也得不到

有没有人能想出办法让它发挥作用

重申一下,当我在gridpane中包含的节点上拖动和移动节点时,我想在控制台中打印每个gridpane的索引

    for (int i=0; i<=11; i++) {
        for (int j=0; j<=11; j++) {

            int colIndex = i;
            int rowIndex = j;

            grid2[i][j] = new Rectangle();
            grid2[i][j].setStroke(Color.BLACK);
            grid2[i][j].setFill(null);
            grid2[i][j].setStrokeWidth(1);
            grid2[i][j].setWidth(30);
            grid2[i][j].setHeight(30);
            //Prints index of each grid2[][] upon mouse entry.
            grid2[i][j].setOnMouseEntered( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
            //Does not work! Want to print index of each grid2[][] upon mouse drag enter.
            grid2[i][j].setOnMouseDragEntered( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
            //Does not work! Want to print index of each grid2[][] upon mouse drag over.
            grid2[i][j].setOnMouseDragOver( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
这些是我应用于gridpane中节点的事件处理程序

    for (int i=0; i<=11; i++) {
        for (int j=0; j<=11; j++) {

            int colIndex = i;
            int rowIndex = j;

            grid2[i][j] = new Rectangle();
            grid2[i][j].setStroke(Color.BLACK);
            grid2[i][j].setFill(null);
            grid2[i][j].setStrokeWidth(1);
            grid2[i][j].setWidth(30);
            grid2[i][j].setHeight(30);
            //Prints index of each grid2[][] upon mouse entry.
            grid2[i][j].setOnMouseEntered( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
            //Does not work! Want to print index of each grid2[][] upon mouse drag enter.
            grid2[i][j].setOnMouseDragEntered( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
            //Does not work! Want to print index of each grid2[][] upon mouse drag over.
            grid2[i][j].setOnMouseDragOver( e -> {
                System.out.printf("Mouse entered cell [%d, %d]%n", colIndex, rowIndex);
            });
for(int i=0;i{
System.out.printf(“鼠标进入单元格[%d,%d]%n”,colIndex,rowIndex);
});
//不行!要在鼠标拖动时打印每个grid2[]]的索引。
grid2[i][j].setOnMouseDragOver(e->{
System.out.printf(“鼠标进入单元格[%d,%d]%n”,colIndex,rowIndex);
});
这些是在按下其中一个按钮时创建的对象的事件处理程序

private EventHandler<MouseEvent> onMousePressedEventHandler = event -> {
    if (event.getSource() instanceof Rectangle) {
        shipSelected = (Rectangle) (event.getSource());

        dragContext.x = shipSelected.getTranslateX() - shipSelected.getWidth()/2;
        dragContext.y = shipSelected.getTranslateY() - shipSelected.getHeight()/2;
    }
};


private EventHandler<MouseEvent> onMouseDragDetectedEventHandler = event -> {
    shipSelected.startFullDrag();

    System.out.println("startfulldrag");
};


private EventHandler<MouseEvent> onMouseDraggedEventHandler = event -> {
    if (event.getSource() instanceof Rectangle) {
        shipSelected = (Rectangle) (event.getSource());

        shipSelected.setX(dragContext.x + event.getX());
        shipSelected.setY(dragContext.y + event.getY());

    }
};
MousePressedEventHandler=event->{ if(event.getSource()instanceof矩形){ shipSelected=(矩形)(event.getSource()); dragContext.x=shipSelected.getTranslateX()-shipSelected.getWidth()/2; dragContext.y=shipSelected.getTranslateY()-shipSelected.getHeight()/2; } }; 私有事件处理程序onMouseDragDetectedEventHandler=事件->{ shipSelected.startFullDrag(); System.out.println(“startfulldrag”); }; 私有EventHandler onMouseDraggedEventHandler=事件->{ if(event.getSource()instanceof矩形){ shipSelected=(矩形)(event.getSource()); shipSelected.setX(dragContext.x+event.getX()); shipSelected.setY(dragContext.y+event.getY()); } };
拖动鼠标时,需要使用
setMouseTransparent(true)
使鼠标周围移动的
矩形透明

private EventHandler<MouseEvent> onMouseDragDetectedEventHandler = event -> {
    shipSelected.startFullDrag();
    shipSelected.setMouseTransparent(true)
    System.out.println("startfulldrag");
};
onMouseDragDetectedEventHandler=event-Handler的私有事件处理程序->{
shipSelected.startFullDrag();
shipSelected.setMouseTransparent(true)
System.out.println(“startfulldrag”);
};
否则,矩形始终是鼠标指针下最上面的元素,您将无法从下面的元素(即网格)中获取Dragenter事件


当然,当您结束拖动时,不要忘记将鼠标透明度设置回false

哇!谢谢我已经和这件蠢事混了四天了。这就是全部。我很感激。再次感谢。有这样好的反馈,很高兴能提供帮助