2017-07-25 70 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

相關問題