2017-07-25 68 views
0

我正在尝试制作一艘战舰游戏。如何在这种情况下让setOnMouseDragOver工作?

下面是代码的链接:Battleship

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

事件处理程序被添加到GridPane在GameGUI.java类起始于线82

基本上,我试图找到任何节点您在GridPane在拖动该对象的索引。我可以通过将setOnMouseEntered应用于gridpane中的每个节点来完成此操作,但是当我尝试利用setOnMouseDragEntered时,我什么也得不到。

有没有人有想法如何让这个工作?

只需重申,我想在控制台中打印每个网格窗格的索引,当我拖动节点并将其移动到网格窗格中包含的节点上时。

这些是我已经应用到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); 
      }); 

这些是您在按下其中一个按钮时创建的对象的事件处理程序。

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()); 

    } 
}; 

回答

0

你需要让你鼠标周围带透明移动setMouseTransparent(true)当你拖动它Rectangle

private EventHandler<MouseEvent> onMouseDragDetectedEventHandler = event -> { 
    shipSelected.startFullDrag(); 
    shipSelected.setMouseTransparent(true) 
    System.out.println("startfulldrag"); 
}; 

否则,矩形一直是你的鼠标指针下最上面的元素,你不会得到从下面(即网格)的元素dragEntered事件。

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

+0

哇!谢谢。我真的一直在搞这个愚蠢的事情,像4天。这就是它所需要的。我很感激。再次感谢。 –

+0

有了这样好的反馈,我们很乐意提供帮助 – mik

相关问题