簡體   English   中英

使用JXML和Scene Builder移動未修飾的舞台Javafx

[英]Moving undecorated stage Javafx with JXML and Scene Builder

我正在嘗試捕獲Javafx中未修飾窗格的X和Y坐標。 該項目是使用javafx,JXML和Scene Builder創建的。 現在,SO上還有其他鏈接可以提示答案,但我完全無法實現。 我得到構建錯誤異常或得到NaN作為坐標。 用以下代碼實現可移動窗格功能所需的最少修改是什么?

這是MainApp.java的代碼(跳過導入過程,因為NetBeans很好地處理了它們)

public class MainApp extends Application {

@Override
public void start(Stage stage) throws Exception {
    GridPane MainPane = FXMLLoader.load(getClass().getResource("/fxml/Scene.fxml"));

    Scene scene = new Scene(MainPane, Color.TRANSPARENT);
    scene.getStylesheets().add("/styles/Styles.css");
    stage.initStyle(StageStyle.TRANSPARENT);

    stage.setScene(scene);
    stage.show();

}

public static void main(String[] args) {
    launch(args);
}

}

FXMLController.java

public class FXMLController extends GridPane {

public void rootNodeClick(MouseEvent mouseEvent) {
System.out.println("click");
}

public void rootNodeDrag(MouseEvent mouseEvent) {
System.out.println("drag");
}
}

XML文件

 <?xml version="1.0" encoding="UTF-8"?>


 <GridPane fx:id="MainPane" alignment="CENTER" focusTraversable="true" maxHeight="550.0" maxWidth="600.0" minHeight="550.0" minWidth="600.0" nodeOrientation="LEFT_TO_RIGHT" onMouseClicked="#rootNodeClick" onMouseDragged="#rootNodeDrag" prefHeight="550.0" prefWidth="600.0" style="-fx-background-color: #ecf0f1; -fx-background-radius: 3;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="FXMLController">
 <columnConstraints>
 <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
 <ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
 </columnConstraints>
 <rowConstraints>
 <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
 <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
 <RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
 </rowConstraints>
 <effect>
 <InnerShadow blurType="GAUSSIAN" color="#ffffff44" height="10.0" radius="4.5" width="10.0" />
 </effect>
 </GridPane>

這樣的事情應該可以解決問題。 按下鼠標時,我們捕獲X和Y並設置拖動結束時的差值。

    final Delta dragDelta = new Delta();
    MainPane.setOnMousePressed(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent me) {
            if (me.getButton() == MouseButton.PRIMARY) {
                dragDelta.x = me.getSceneX();
                dragDelta.y = me.getSceneY();
            }
        }
    });

    MainPane.setOnMouseDragged(new EventHandler<MouseEvent>() {
        @Override
        public void handle(MouseEvent me) {
            if (me.getButton() == MouseButton.PRIMARY) {
                scene.getWindow().setX(me.getScreenX() - dragDelta.x);
                scene.setY(me.getScreenY() - dragDelta.y);
            }
        }
    });

這是三角洲

public class Delta {
    public double x;
    public double y;
}

最初的答案是在Stackoverflow上找到的,我很久以前就使用過,但是我再也找不到了,所以很抱歉原來的答案

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM