次のマウスリスナーを使用して、装飾されていないステージを画面の周りに移動しようとしています。
これらのイベントは長方形からのものです。私のアイデアは、装飾されていないウィンドウを長方形をクリックして移動し、すべてのウィンドウをドラッグすることです。
@ 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); }
これらのイベントで得られるのは、四角形を押してウィンドウのドラッグを開始すると、少し移動します。しかし、ボタンを離すと、ウィンドウが長方形のある場所に移動します。
前もって感謝します。
私は、装飾されていないウィンドウにドラッグできるアニメーションクロックの 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; }
コードはあなたのものとかなり似ているので、なぜあなたのコードがあなたのために働いていないのかよくわかりません。
私はこのソリューションを使用して、含まれているノードをドラッグすることにより、非装飾ステージをドラッグしています。
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);
}
}
});
}
私の推測では、
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);
さらに、マウスの中央ボタンを使用して、ウィンドウを画面の中央に配置します。それがお役に立てば幸いです。乾杯!
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
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);
}
}