События перетаскивания мыши JavaFX не запускаются - PullRequest
0 голосов
/ 25 января 2019

Я перепробовал почти все, но события перетаскивания мыши не запускаются, как описано здесь:

https://openjfx.io/javadoc/11/javafx.graphics/javafx/scene/input/MouseDragEvent.html

Вот минимальный пример, так что вы можете попробовать его (я использую Java 11 с JavaFX 11.0.2):

import javafx.application.Application;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.*;
import javafx.stage.Stage;


public class Main extends Application {

    private double mouseClickPositionX, mouseClickPositionY, currentRelativePositionX, currentRelativePositionY;

    @Override
    public void start(Stage primaryStage) throws Exception{
        primaryStage.setTitle("Hello World");

        BorderPane mainBorderPane = new BorderPane();
        BorderPane centerBorderPane = new BorderPane();
        FlowPane flowPane = new FlowPane();
        GridPane gridPane = new GridPane();
        Button button1 = new Button("button1");
        gridPane.add(button1, 0, 0);
        flowPane.getChildren().add(gridPane);
        centerBorderPane.setCenter(flowPane);
        HBox hbox = new HBox();
        TilePane tilePane = new TilePane();
        Button button2 = new Button("button2");
        tilePane.getChildren().add(button2);
        hbox.getChildren().add(tilePane);
        mainBorderPane.setCenter(centerBorderPane);
        centerBorderPane.setBottom(hbox);

        // button2 event handlers

        button2.setOnMousePressed(event -> {
            mouseClickPositionX = event.getSceneX();
            mouseClickPositionY = event.getSceneY();
            currentRelativePositionX = button2.getTranslateX();
            currentRelativePositionY = button2.getTranslateY();
            button2.setMouseTransparent(true);
        });

        button2.setOnMouseDragged(event -> {
            button2.setTranslateX(currentRelativePositionX + (event.getSceneX() - mouseClickPositionX));
            button2.setTranslateY(currentRelativePositionY + (event.getSceneY() - mouseClickPositionY));
        });

        button2.setOnDragDetected(event -> {
            button2.startFullDrag();
        });

        button2.setOnMouseReleased((event) -> {
            button2.setMouseTransparent(false);
        });

        // button1 event handlers

        button1.setOnMouseDragReleased((event) -> {
            System.out.println("it works in button1");
        });

        // gridPane event handlers

        gridPane.setOnMouseDragReleased((event) -> {
            System.out.println("it works in gridPane");
        });

        primaryStage.setScene(new Scene(mainBorderPane, 300, 275));
        primaryStage.show();
    }


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

Я хочу получить ссылку на button2 либо в button1, либо в gridPane через setOnMouseDragReleased. Есть много вложенных панелей и т. Д., Потому что я хотел сохранить исходную структуру макета проекта. Я сделал это, потому что я не уверен, может ли это быть причиной неработоспособности.

Заранее спасибо.

Ответы [ 2 ]

0 голосов
/ 25 января 2019

В итоге я вручную запустил события от centerBorderPane до gridPane, используя node.fireEvent(event). Также реализована вспомогательная функция, которая возвращает правый дочерний узел:

  private Optional<Node> findNode(Pane pane, double x, double y) {
    return pane.getChildren().stream().filter(n -> {
      Point2D point = n.sceneToLocal(x, y);
      return n.contains(point.getX(), point.getY());
    }).findAny();
  }

Не забудьте использовать события, чтобы не попасть в бесконечный цикл.

0 голосов
/ 25 января 2019

MOUSE_DRAG_RELEASED срабатывает, когда перетаскивание заканчивается на этом узле. Например

 centerBorderPane.setOnMouseDragReleased((event) -> {
        System.out.println("centerBorderPane drag released");
 });

должен срабатывать при перетаскивании button2, и перетаскивание заканчивается на centerBorderPane.

Чтобы вызвать событие, когда мышь наведена на button1, используйте button1.setOnMouseDragged
Если вы хотите передать событие мыши от родителя его дочерним элементам, см. this

...