【JAVAFX】弹出自定义的fxml窗口,带浮动窗口

java 复制代码
                    // 加载FXML文件:设置加载路径为资源目录下的small.fxml
                    loader.setLocation(getClass().getResource("/small.fxml"));
                    // 加载FXML并获取根节点(界面布局的最外层容器)
                    root = loader.load();
                    // 设置根节点背景为浅蓝色(#ADD8E6)
                    root.setStyle("-fx-background-color: #ADD8E6;");

                    // 创建场景,将根节点作为内容
                    Scene scene = new Scene(root);

                    // 定义变量存储鼠标拖动时的偏移量(相对于窗口左上角)
                    AtomicReference<Double> xOffset = new AtomicReference<>((double) 0);
                    AtomicReference<Double> yOffset = new AtomicReference<>((double) 0);

                    // 监听根节点的鼠标按下事件(记录初始位置)
                    root.setOnMousePressed(event -> {
                        // 计算鼠标按下时,鼠标坐标相对于窗口左上角的偏移量
                        xOffset.set(event.getSceneX());  // 鼠标在场景中的X坐标(相对于根节点左上角)
                        yOffset.set(event.getSceneY());  // 鼠标在场景中的Y坐标
                    });

                    // 监听根节点的鼠标拖动事件(移动窗口)
                    root.setOnMouseDragged(event -> {
                        // 动态更新窗口位置:
                        // 新X坐标 = 鼠标当前屏幕X坐标 - 初始偏移X
                        // 新Y坐标 = 鼠标当前屏幕Y坐标 - 初始偏移Y
                        primaryStage.setX(event.getScreenX() - xOffset.get());
                        primaryStage.setY(event.getScreenY() - yOffset.get());
                    });

                    // 设置窗口为模态(阻塞父窗口操作,需配合initOwner指定父窗口)
                    primaryStage.initModality(Modality.WINDOW_MODAL);
                    // 关联场景到窗口
                    primaryStage.setScene(scene);
                    // 窗口始终置顶显示
                    primaryStage.setAlwaysOnTop(true);
                    // 初始位置(X=1620,Y=134)
                    primaryStage.setX(1620);
                    primaryStage.setY(134);
                    // 窗口不可调整大小
                    primaryStage.setResizable(false);
                    // 透明样式(无标题栏和边框)
                    primaryStage.initStyle(StageStyle.TRANSPARENT);
                    // 显示窗口
                    primaryStage.show();

fxml文件

java 复制代码
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.text.*?>
<?import javafx.scene.control.*?>
<?import java.lang.*?>
<?import javafx.scene.layout.*?>


<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="126.0" prefWidth="297.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <TextArea fx:id="finalResult" layoutX="4.0" layoutY="47.0" prefHeight="73.0" prefWidth="290.0" AnchorPane.topAnchor="47.0" />
      <Label fx:id="inputStatus" layoutX="7.0" layoutY="14.0" prefHeight="25.0" prefWidth="290.0" text="录音中,按CTR+R停止" />
   </children>
</AnchorPane>