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>