24

次のマウスリスナーを使用して、装飾されていないステージを画面上で移動しようとしています。

  • onPressed
  • onReleased
  • onDragged

これらのイベントは四角形からのものです。私の考えは、長方形をクリックしてすべてのウィンドウをドラッグして、装飾されていないウィンドウを移動することです。

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

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

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

これらのイベントで得られるのは、四角形を押してウィンドウをドラッグし始めると、ウィンドウが少し移動することだけです。しかし、ボタンを放すと、ウィンドウは長方形の場所に移動します。

前もって感謝します。

4

5 に答える 5

29

ドラッグできる装飾されていないウィンドウに、アニメーション時計のサンプルを作成しました。

サンプルの関連コードは次のとおりです。

// 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; } 

コードはあなたのコードとよく似ているため、コードが機能しない理由がよくわかりません。

于 2012-08-02T15:53:45.293 に答える
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);
            }
        }
    });
}
于 2012-10-18T19:07:32.220 に答える
3

私の推測では、あなたの:

onRectangleReleased()

あなたからまったく同じ座標を渡しています

onRectanglePressed()

これは、ドキュメントに記載されているように、MouseEvent クラスの getX() メソッドが返されるために発生します。

MouseEvent のソースの原点に対するイベントの水平位置。

次に、マウスを離すと、最初にマウスを押したときの場所に実際に長方形が配置されます。

ところで、内部に Rectangle を含む StackPane を使用してから、次のコードを適用します。

private void addDragListeners(final Node n){
       n.setOnMousePressed(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent me) {
                if(me.getButton()!=MouseButton.MIDDLE)
                {
                    initialX = me.getSceneX();
                    initialY = me.getSceneY();
                }
                else
                {
                    n.getScene().getWindow().centerOnScreen();
                    initialX = n.getScene().getWindow().getX();
                    initialY = n.getScene().getWindow().getY();
                }

            }
       });

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

addDragListeners(mainStackPane);

それに加えて、マウスの中央ボタンを使用してウィンドウを画面の中央に配置します。お役に立てば幸いです。乾杯!

于 2012-08-02T23:48:56.213 に答える
1
double x, y;

private void addDragListeners(final Node n, Stage primaryStage){

    n.setOnMousePressed((MouseEvent mouseEvent) -> {
        this.x = n.getScene().getWindow().getX() - mouseEvent.getScreenX();
        this.y = n.getScene().getWindow().getY() - mouseEvent.getScreenY();
    });

    n.setOnMouseDragged((MouseEvent mouseEvent) -> {
        primaryStage.setX(mouseEvent.getScreenX() + this.x);
        primaryStage.setY(mouseEvent.getScreenY() + this.y);
    });
}

public void start(Stage primaryStage) {

    try {

        ...

        addDragListeners(mainPane, primaryStage);

    } catch (Exception e) {
        e.printStackTrace(System.out);
    }

}
于 2014-10-15T03:56:27.553 に答える