JavaFX 之窗口拖動(三)


一、問題場景

  在上一篇中,我們將窗口的默認標題欄隱藏從而導致鼠標點擊窗體無法進行拖動。

二、解決思路

  給組件添加鼠標按下事件監聽器和鼠標拖動事件監聽器。

三、代碼實現

/**
 * 程序入口
 * @author Light
 */
public class JavaFXTest extends Application {
    
    @Override
    public void start(Stage stage) {
        
        stage.initStyle(StageStyle.TRANSPARENT);
        
        VBox root = new VBox();
        root.setId("root");
        // 引入樣式
        root.getStylesheets().add(JavaFXTest.class.getResource("/resources/style.css").toString());
        
        //頂部
        VBox top = new VBox();
        top.setId("top");
        top.setPrefSize(300,26);
        // 標題欄
        AnchorPane title = new AnchorPane();
        Label close = new Label();
        close.setPrefWidth(33);
        close.setPrefHeight(26);
        close.setId("winClose");//winClose css樣式Id
        title.getChildren().add(close);
        AnchorPane.setRightAnchor(close, 0.0);
        AnchorPane.setTopAnchor(close, 5.0);
        top.getChildren().add(title);
        
        // 內容
        VBox content = new VBox();
        content.setPrefWidth(300);
        content.setMinHeight(200);
        // 組裝
        root.getChildren().addAll(top, content);
        Scene scene = new Scene(root);        
        stage.setScene(scene);
        // 拖動監聽器
        DragUtil.addDragListener(stage, top);
        // 顯示
        stage.show();
    }
    
    

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }
    
}

 

/**
 * 工具類
 * @author Light
 */
public class DragUtil {
     public static void addDragListener(Stage stage,Node root) {
        new DragListener(stage).enableDrag(root);
    }
}
/**
 * 拖拽監聽器
 * @author Light
 */
public class DragListener implements EventHandler<MouseEvent> {

    private double xOffset = 0;
    private double yOffset = 0;
    private final Stage stage;

    public DragListener(Stage stage) {
        this.stage = stage;
    }

    @Override
    public void handle(MouseEvent event) {
        event.consume();
        if (event.getEventType() == MouseEvent.MOUSE_PRESSED) {
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        } else if (event.getEventType() == MouseEvent.MOUSE_DRAGGED) {
            stage.setX(event.getScreenX() - xOffset);
            if(event.getScreenY() - yOffset < 0) {
                stage.setY(0);
            }else {
                stage.setY(event.getScreenY() - yOffset);
            }
        }
    }

    public void enableDrag(Node node) {
        node.setOnMousePressed(this);
        node.setOnMouseDragged(this);
    }
}

效果演示圖:


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM