资讯专栏INFORMATION COLUMN

JavaFx中Controller获取Stage并自定义窗口移动与缩放逻辑

Alliot / 2861人阅读

摘要:中获取并自定义窗口移动与缩放逻辑由于去掉了平台自带了标题栏,窗口就无法移动和缩放了,需要我们自己来实现。

JavaFx中Controller获取Stage并自定义窗口移动与缩放逻辑

由于去掉了平台自带了标题栏,窗口就无法移动和缩放了,需要我们自己来实现。

去除窗口标题栏

</>复制代码

  1. public class Main extends Application {
  2. @Override
  3. public void start(Stage primaryStage) throws Exception {
  4. Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
  5. primaryStage.setTitle("main");
  6. // 主要是这一句
  7. primaryStage.initStyle(StageStyle.TRANSPARENT);
  8. primaryStage.setScene(new Scene(root));
  9. primaryStage.show();
  10. }
  11. public static void main(String[] args) {
  12. launch(args);
  13. }
  14. }
在Controller中获取Stage

首先确定在Controller中获取到你的跟布局对象,如下:

</>复制代码

  1. public class Controller implements Initializable {
  2. public BorderPane root;
  3. private Stage stage;
  4. }

</>复制代码

然后可以在public void initialize(URL url, ResourceBundle resourceBundle) 方法内获取Stage

</>复制代码

  1. public class Controller implements Initializable {
  2. public BorderPane root;
  3. private Stage stage;
  4. @Override
  5. public void initialize(URL url, ResourceBundle resourceBundle) {
  6. var stage = getStage();
  7. }
  8. private Stage getStage() {
  9. if (stage == null) {
  10. stage = (Stage) root.getScene().getWindow();
  11. }
  12. return stage;
  13. }
  14. }
自定义窗体移动与缩放逻辑

记录鼠标坐标

</>复制代码

  1. root.setOnMousePressed(event -> {
  2. event.consume();
  3. xOffset = event.getSceneX();
  4. yOffset = event.getSceneY();
  5. });

自定义移动控制区域

</>复制代码

  1. dragArea.setOnMouseDragged(event -> {
  2. event.consume();
  3. var stage = getStage();
  4. stage.setX(event.getScreenX() - xOffset);
  5. stage.setY(event.getScreenY() - yOffset);
  6. });

判断鼠标坐标位置,并处理光标变换

</>复制代码

  1. root.setOnMouseMoved(this::mouseMoveHandle);
  2. private void mouseMoveHandle(MouseEvent event) {
  3. event.consume();
  4. double x = event.getSceneX();
  5. double y = event.getSceneY();
  6. var stage = getStage();
  7. double width = stage.getWidth();
  8. double height = stage.getHeight();
  9. Cursor cursorType = Cursor.DEFAULT;
  10. bit = 0;
  11. if (y >= height - RESIZE_WIDTH) {
  12. if (x <= RESIZE_WIDTH) {
  13. bit |= 1 << 3;
  14. } else if (x >= width - RESIZE_WIDTH) {
  15. bit |= 1;
  16. bit |= 1 << 2;
  17. cursorType = Cursor.SE_RESIZE;
  18. } else {
  19. bit |= 1;
  20. cursorType = Cursor.S_RESIZE;
  21. }
  22. } else if (x >= width - RESIZE_WIDTH) {
  23. bit |= 1 << 2;
  24. cursorType = Cursor.E_RESIZE;
  25. }
  26. root.setCursor(cursorType);
  27. }

处理窗口缩放

</>复制代码

  1. root.setOnMouseDragged(this::mouseDraggedHandle);
  2. private void mouseDraggedHandle(MouseEvent event) {
  3. event.consume();
  4. var primaryStage = getStage();
  5. double x = event.getSceneX();
  6. double y = event.getSceneY();
  7. double nextX = primaryStage.getX();
  8. double nextY = primaryStage.getY();
  9. double nextWidth = primaryStage.getWidth();
  10. double nextHeight = primaryStage.getHeight();
  11. if ((bit & 1 << 2) != 0) {
  12. nextWidth = x;
  13. }
  14. if ((bit & 1) != 0) {
  15. nextHeight = y;
  16. }
  17. if (nextWidth <= MIN_WIDTH) {
  18. nextWidth = MIN_WIDTH;
  19. }
  20. if (nextHeight <= MIN_HEIGHT) {
  21. nextHeight = MIN_HEIGHT;
  22. }
  23. primaryStage.setX(nextX);
  24. primaryStage.setY(nextY);
  25. primaryStage.setWidth(nextWidth);
  26. primaryStage.setHeight(nextHeight);
  27. }

完整代码

</>复制代码

  1. package line.main;
  2. import javafx.fxml.Initializable;
  3. import javafx.scene.Cursor;
  4. import javafx.scene.input.MouseEvent;
  5. import javafx.scene.layout.BorderPane;
  6. import javafx.scene.layout.Pane;
  7. import javafx.stage.Stage;
  8. import java.net.URL;
  9. import java.util.ResourceBundle;
  10. public class Controller implements Initializable {
  11. public BorderPane root;
  12. public Pane dragArea;
  13. private Stage stage;
  14. private double xOffset = 0;
  15. private double yOffset = 0;
  16. private int bit = 0;//left,right,top,bottom
  17. private static final double RESIZE_WIDTH = 5.00;
  18. private static final double MIN_WIDTH = 600.00;
  19. private static final double MIN_HEIGHT = 400.00;
  20. @Override
  21. public void initialize(URL url, ResourceBundle resourceBundle) {
  22. dragArea.setOnMouseDragged(event -> {
  23. event.consume();
  24. var stage = getStage();
  25. stage.setX(event.getScreenX() - xOffset);
  26. stage.setY(event.getScreenY() - yOffset);
  27. });
  28. root.setOnMousePressed(event -> {
  29. event.consume();
  30. xOffset = event.getSceneX();
  31. yOffset = event.getSceneY();
  32. });
  33. root.setOnMouseMoved(this::mouseMoveHandle);
  34. root.setOnMouseDragged(this::mouseDraggedHandle);
  35. }
  36. private Stage getStage() {
  37. if (stage == null) {
  38. stage = (Stage) root.getScene().getWindow();
  39. }
  40. return stage;
  41. }
  42. private void mouseMoveHandle(MouseEvent event) {
  43. event.consume();
  44. double x = event.getSceneX();
  45. double y = event.getSceneY();
  46. var stage = getStage();
  47. double width = stage.getWidth();
  48. double height = stage.getHeight();
  49. Cursor cursorType = Cursor.DEFAULT;
  50. bit = 0;
  51. if (y >= height - RESIZE_WIDTH) {
  52. if (x <= RESIZE_WIDTH) {
  53. bit |= 1 << 3;
  54. } else if (x >= width - RESIZE_WIDTH) {
  55. bit |= 1;
  56. bit |= 1 << 2;
  57. cursorType = Cursor.SE_RESIZE;
  58. } else {
  59. bit |= 1;
  60. cursorType = Cursor.S_RESIZE;
  61. }
  62. } else if (x >= width - RESIZE_WIDTH) {
  63. bit |= 1 << 2;
  64. cursorType = Cursor.E_RESIZE;
  65. }
  66. root.setCursor(cursorType);
  67. }
  68. private void mouseDraggedHandle(MouseEvent event) {
  69. event.consume();
  70. var primaryStage = getStage();
  71. double x = event.getSceneX();
  72. double y = event.getSceneY();
  73. double nextX = primaryStage.getX();
  74. double nextY = primaryStage.getY();
  75. double nextWidth = primaryStage.getWidth();
  76. double nextHeight = primaryStage.getHeight();
  77. if ((bit & 1 << 2) != 0) {
  78. nextWidth = x;
  79. }
  80. if ((bit & 1) != 0) {
  81. nextHeight = y;
  82. }
  83. if (nextWidth <= MIN_WIDTH) {
  84. nextWidth = MIN_WIDTH;
  85. }
  86. if (nextHeight <= MIN_HEIGHT) {
  87. nextHeight = MIN_HEIGHT;
  88. }
  89. primaryStage.setX(nextX);
  90. primaryStage.setY(nextY);
  91. primaryStage.setWidth(nextWidth);
  92. primaryStage.setHeight(nextHeight);
  93. }
  94. }

文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。

转载请注明本文地址:https://www.ucloud.cn/yun/77410.html

相关文章

  • JavaFX 8 下简化自定义控件的外部调用以及流式布局示例

    摘要:故可采用自定义控件的方式简化外部的代码调用。自定义控件的设计版本之后,提供写法,此时要求必须继承自节点对象,使用加载时,必须调用方法。 「博客搬家」 原地址: 简书 原发表时间: 2017-05-21 有一个项目,需要模拟数千台设备的工作情况,这数千个设备分为若干组,每组 100 台。故需要设计一款 GUI 程序,包含 100 个自定义控件,模拟一组设备的工作情况,通过 List...

    MartinHan 评论0 收藏0
  • JavaFX 学习笔记——窗口控件

    摘要:创建窗口添加类为元素间空隙与主窗口创建过程相同,新建布局及控件,最后使用的方法显示出来。设置主窗口中的按钮事件,点击按钮后会显示一个窗口。这时我们可以通过函数设置窗口关闭时触发的事件在关闭窗口时,首先执行这一事件处理函数,再将窗口关闭。 前言 如今比较流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前还只能在运行Winsows上。Qt(w...

    Pocher 评论0 收藏0
  • JavaFx系列教程之一:JavaFx+Springboot+Maven 开发打包教程

    摘要:最近在用开发窗体程序,并且以后打算把所有的窗体软件切换到上面,并且还想用的各种好处,集成了就可以愉快的用各种服务了。最重要的是打包工具。由于我是,一般用和,执行命令会看到打包成了和两种类型的安装包。由于没有计算机,所以还不知道打包成的状态。 最近在用 JavaFx 开发窗体程序,并且以后打算把所有的窗体软件切换到 JavaFx 上面,并且还想用 springboot 的__各种好处,集...

    Coding01 评论0 收藏0
  • Java™ 教程(匿名类)

    匿名类 匿名类可以使你代码更简洁,它们使你能够同时声明和实例化一个类,它们就像局部类,除了它们没有名称,如果你只需要使用局部类一次,请使用它们。 声明匿名类 虽然局部类是类声明,但匿名类是表达式,这意味着你在另一个表达式中定义该类,以下示例HelloWorldAnonymousClasses在局部变量frenchGreeting和spanishGreeting的初始化语句中使用匿名类,但使用局部类...

    xietao3 评论0 收藏0
  • 【浏览器&exe桌面应用】用javafx webview 打造自己的浏览器

    摘要:背景项目需要做一个客户端的壳,内置浏览器,访问指定的采用技术开始吧环境配置略效果 背景 项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术 java 1.8 开始吧! java环境配置略 hello world import javafx.application.Application; import javafx.beans.value.ChangeListener;...

    mdluo 评论0 收藏0

发表评论

0条评论

Alliot

|高级讲师

TA的文章

阅读更多
最新活动
阅读需要支付1元查看
<