[英]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.