在javafx中移动一个未修饰的阶段2

Ant*_* J. 23 stage javafx-2

我一直试图通过使用以下鼠标监听器在屏幕上移动一个未修饰的阶段:

  • onPressed
  • onReleased
  • onDragged

这些事件来自一个矩形.我的想法是移动未装饰的窗口,点击矩形并拖动所有窗口.

@FXML
protected void onRectanglePressed(MouseEvent event) {
    X = primaryStage.getX() - event.getScreenX();
    Y = primaryStage.getY() - event.getScreenY();
}

@FXML
protected void onRectangleReleased(MouseEvent event) {
    primaryStage.setX(event.getScreenX());
    primaryStage.setY(event.getScreenY());
}

@FXML
protected void onRectangleDragged(MouseEvent event) {
    primaryStage.setX(event.getScreenX() + X);
    primaryStage.setY(event.getScreenY() + Y);
}

我用这些事件得到的就是当我按下矩形并开始拖动窗口时,它会移动一点点.但是,当我释放按钮时,窗口移动到矩形所在的位置.

提前致谢.

jew*_*sea 28

我在未修饰的窗口中创建了一个动画时钟样本,您可以拖动它.

样本的相关代码是:

// allow the clock background to be used to drag the clock around.
final Delta dragDelta = new Delta();
layout.setOnMousePressed(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    // record a delta distance for the drag and drop operation.
    dragDelta.x = stage.getX() - mouseEvent.getScreenX();
    dragDelta.y = stage.getY() - mouseEvent.getScreenY();
  }
});
layout.setOnMouseDragged(new EventHandler<MouseEvent>() {
  @Override public void handle(MouseEvent mouseEvent) {
    stage.setX(mouseEvent.getScreenX() + dragDelta.x);
    stage.setY(mouseEvent.getScreenY() + dragDelta.y);
  }
});

...

// records relative x and y co-ordinates.
class Delta { double x, y; } 
Run Code Online (Sandbox Code Playgroud)

代码与您的代码看起来很相似,所以不太确定为什么您的代码不适合您.


小智 14

我正在使用此解决方案通过拖动任何包含的节点来拖动未解决的阶段.

private void addDraggableNode(final Node node) {

    node.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent me) {
            if (me.getButton() != MouseButton.MIDDLE) {
                initialX = me.getSceneX();
                initialY = me.getSceneY();
            }
        }
    });

    node.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent me) {
            if (me.getButton() != MouseButton.MIDDLE) {
                node.getScene().getWindow().setX(me.getScreenX() - initialX);
                node.getScene().getWindow().setY(me.getScreenY() - initialY);
            }
        }
    });
}
Run Code Online (Sandbox Code Playgroud)