web-dev-qa-db-ja.com

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

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

前もって感謝します。

24
Antonio J.

私は、装飾されていないウィンドウにドラッグできるアニメーションクロックの sample を作成しました。

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

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

コードはあなたのものとかなり似ているので、なぜあなたのコードがあなたのために働いていないのかよくわかりません。

29
jewelsea

私はこのソリューションを使用して、含まれているノードをドラッグすることにより、非装飾ステージをドラッグしています。

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);
            }
        }
    });
}
14
Zsolt

私の推測では、

onRectangleReleased()

あなたから非常に同じ座標を渡しています

onRectanglePressed()

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

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

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

ところで、私は内部に四​​角形を含む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);

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

3
Bruno Vieira

Jewelseaの返信に基づいて、start()メソッドでシーンに直接MouseListenersを設定する2つのランバ式を作成しました。正常に動作します :)

private double xOffset;
private double yOffset;
         /*
        The two following lambda expressions makes it possible to move the application without the standard StageStyle
         */
        //Lambda mouse event handler
        scene.setOnMousePressed(event -> {
            xOffset = primaryStage.getX() - event.getScreenX();
            yOffset = primaryStage.getY() - event.getScreenY();
        });
        //Lambda mouse event handler
        scene.setOnMouseDragged(event -> {
            primaryStage.setX(event.getScreenX() + xOffset);
            primaryStage.setY(event.getScreenY() + yOffset);
        });enter code here
2
M. Kahlen
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);
    }

}
1
Sameer