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

时间:2017-07-25 05:24:06

标签: java javafx

我正在尝试制作一艘战舰游戏。

以下是代码的链接:Battleship

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

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

基本上,我试图找到在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());

    }
};

1 个答案:

答案 0 :(得分:0)

在拖动鼠标时,您需要使用Rectangle使鼠标移动setMouseTransparent(true)透明。

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

否则,Rectangle始终是鼠标指针下面的最顶层元素,并且您不会从下面的元素(即网格)中获取dragEntered事件。

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