javaFx在Stage使用UNDECORATED布局时的窗体拖拽实现

package ch04;


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;
public class DraggingStage extends Application {


	private Stage stage;
	// 点击鼠标时的x坐标值
	private double dragOffsetX;
	// 点击鼠标时的y坐标值
	private double dragOffsetY;
	public static void main(String[] args) {
		Application.launch(DraggingStage.class, args);
	}
	@Override
	public void start(Stage primaryStage) {
		// Store the stage reference in the instance variable to
		// use it in the mouse pressed event handler later.
		this.stage = primaryStage;
		Label msgLabel = new Label("Press the mouse button and drag.");
		Button closeButton = new Button("Close");
		// closeButton.setOnAction(e -> stage.close());
		closeButton.setOnAction(e -> primaryStage.close());
		VBox root = new VBox();
		root.getChildren().addAll(msgLabel, closeButton);
		Scene scene = new Scene(root, 300, 200);
		// Set lambda of mouse pressed and dragged even handlers for the scene
		scene.setOnMousePressed((ev) -> handleMousePressed(ev));
		// scene.setOnMousePressed(this::handleMousePressed(e));
		scene.setOnMouseDragged(e -> handleMouseDragged(e));
		stage.setScene(scene);
		stage.setTitle("Moving a Stage");
		stage.initStyle(StageStyle.UNDECORATED);
		stage.show();
	}
	/**
	@class DraggingStage
	@date 2020/5/24
	@author qiaowei
	@version 1.0
	@brief 点击鼠标时触发事件
	@param e 鼠标事件
	*/
	protected void handleMousePressed(MouseEvent e) {
		// Store the mouse x and y coordinates with respect to the
		// stage in the reference variables to use them in the drag event
		// 点击鼠标时,获取鼠标在窗体上点击时相对应窗体左上角的偏移
		this.dragOffsetX = e.getScreenX() - stage.getX();
		this.dragOffsetY = e.getScreenY() - stage.getY();
	}
	
	protected void handleMouseDragged(MouseEvent e) {
		// Move the stage by the drag amount
		// 拖动鼠标后,获取鼠标相对应显示器坐标减去鼠标相对窗体的坐标,并将其设置为窗体在显示器上的坐标
		stage.setX(e.getScreenX() - this.dragOffsetX);
		stage.setY(e.getScreenY() - this.dragOffsetY);
	}

}

//参:https://blog.csdn.net/weixin_34695463/article/details/114729954
posted @ 2022-11-20 21:36  涂山树下  阅读(170)  评论(0)    收藏  举报