摘要:中获取并自定义窗口移动与缩放逻辑由于去掉了平台自带了标题栏,窗口就无法移动和缩放了,需要我们自己来实现。
JavaFx中Controller获取Stage并自定义窗口移动与缩放逻辑
由于去掉了平台自带了标题栏,窗口就无法移动和缩放了,需要我们自己来实现。
去除窗口标题栏</>复制代码
public class Main extends Application {
@Override
public void start(Stage primaryStage) throws Exception {
Parent root = FXMLLoader.load(getClass().getResource("main.fxml"));
primaryStage.setTitle("main");
// 主要是这一句
primaryStage.initStyle(StageStyle.TRANSPARENT);
primaryStage.setScene(new Scene(root));
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
在Controller中获取Stage
首先确定在Controller中获取到你的跟布局对象,如下:
</>复制代码
public class Controller implements Initializable {
public BorderPane root;
private Stage stage;
}
</>复制代码
然后可以在public void initialize(URL url, ResourceBundle resourceBundle) 方法内获取Stage
</>复制代码
public class Controller implements Initializable {
public BorderPane root;
private Stage stage;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
var stage = getStage();
}
private Stage getStage() {
if (stage == null) {
stage = (Stage) root.getScene().getWindow();
}
return stage;
}
}
自定义窗体移动与缩放逻辑
记录鼠标坐标
</>复制代码
root.setOnMousePressed(event -> {
event.consume();
xOffset = event.getSceneX();
yOffset = event.getSceneY();
});
自定义移动控制区域
</>复制代码
dragArea.setOnMouseDragged(event -> {
event.consume();
var stage = getStage();
stage.setX(event.getScreenX() - xOffset);
stage.setY(event.getScreenY() - yOffset);
});
判断鼠标坐标位置,并处理光标变换
</>复制代码
root.setOnMouseMoved(this::mouseMoveHandle);
private void mouseMoveHandle(MouseEvent event) {
event.consume();
double x = event.getSceneX();
double y = event.getSceneY();
var stage = getStage();
double width = stage.getWidth();
double height = stage.getHeight();
Cursor cursorType = Cursor.DEFAULT;
bit = 0;
if (y >= height - RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {
bit |= 1 << 3;
} else if (x >= width - RESIZE_WIDTH) {
bit |= 1;
bit |= 1 << 2;
cursorType = Cursor.SE_RESIZE;
} else {
bit |= 1;
cursorType = Cursor.S_RESIZE;
}
} else if (x >= width - RESIZE_WIDTH) {
bit |= 1 << 2;
cursorType = Cursor.E_RESIZE;
}
root.setCursor(cursorType);
}
处理窗口缩放
</>复制代码
root.setOnMouseDragged(this::mouseDraggedHandle);
private void mouseDraggedHandle(MouseEvent event) {
event.consume();
var primaryStage = getStage();
double x = event.getSceneX();
double y = event.getSceneY();
double nextX = primaryStage.getX();
double nextY = primaryStage.getY();
double nextWidth = primaryStage.getWidth();
double nextHeight = primaryStage.getHeight();
if ((bit & 1 << 2) != 0) {
nextWidth = x;
}
if ((bit & 1) != 0) {
nextHeight = y;
}
if (nextWidth <= MIN_WIDTH) {
nextWidth = MIN_WIDTH;
}
if (nextHeight <= MIN_HEIGHT) {
nextHeight = MIN_HEIGHT;
}
primaryStage.setX(nextX);
primaryStage.setY(nextY);
primaryStage.setWidth(nextWidth);
primaryStage.setHeight(nextHeight);
}
完整代码
</>复制代码
package line.main;
import javafx.fxml.Initializable;
import javafx.scene.Cursor;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
import java.net.URL;
import java.util.ResourceBundle;
public class Controller implements Initializable {
public BorderPane root;
public Pane dragArea;
private Stage stage;
private double xOffset = 0;
private double yOffset = 0;
private int bit = 0;//left,right,top,bottom
private static final double RESIZE_WIDTH = 5.00;
private static final double MIN_WIDTH = 600.00;
private static final double MIN_HEIGHT = 400.00;
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
dragArea.setOnMouseDragged(event -> {
event.consume();
var stage = getStage();
stage.setX(event.getScreenX() - xOffset);
stage.setY(event.getScreenY() - yOffset);
});
root.setOnMousePressed(event -> {
event.consume();
xOffset = event.getSceneX();
yOffset = event.getSceneY();
});
root.setOnMouseMoved(this::mouseMoveHandle);
root.setOnMouseDragged(this::mouseDraggedHandle);
}
private Stage getStage() {
if (stage == null) {
stage = (Stage) root.getScene().getWindow();
}
return stage;
}
private void mouseMoveHandle(MouseEvent event) {
event.consume();
double x = event.getSceneX();
double y = event.getSceneY();
var stage = getStage();
double width = stage.getWidth();
double height = stage.getHeight();
Cursor cursorType = Cursor.DEFAULT;
bit = 0;
if (y >= height - RESIZE_WIDTH) {
if (x <= RESIZE_WIDTH) {
bit |= 1 << 3;
} else if (x >= width - RESIZE_WIDTH) {
bit |= 1;
bit |= 1 << 2;
cursorType = Cursor.SE_RESIZE;
} else {
bit |= 1;
cursorType = Cursor.S_RESIZE;
}
} else if (x >= width - RESIZE_WIDTH) {
bit |= 1 << 2;
cursorType = Cursor.E_RESIZE;
}
root.setCursor(cursorType);
}
private void mouseDraggedHandle(MouseEvent event) {
event.consume();
var primaryStage = getStage();
double x = event.getSceneX();
double y = event.getSceneY();
double nextX = primaryStage.getX();
double nextY = primaryStage.getY();
double nextWidth = primaryStage.getWidth();
double nextHeight = primaryStage.getHeight();
if ((bit & 1 << 2) != 0) {
nextWidth = x;
}
if ((bit & 1) != 0) {
nextHeight = y;
}
if (nextWidth <= MIN_WIDTH) {
nextWidth = MIN_WIDTH;
}
if (nextHeight <= MIN_HEIGHT) {
nextHeight = MIN_HEIGHT;
}
primaryStage.setX(nextX);
primaryStage.setY(nextY);
primaryStage.setWidth(nextWidth);
primaryStage.setHeight(nextHeight);
}
}
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/77410.html
摘要:故可采用自定义控件的方式简化外部的代码调用。自定义控件的设计版本之后,提供写法,此时要求必须继承自节点对象,使用加载时,必须调用方法。 「博客搬家」 原地址: 简书 原发表时间: 2017-05-21 有一个项目,需要模拟数千台设备的工作情况,这数千个设备分为若干组,每组 100 台。故需要设计一款 GUI 程序,包含 100 个自定义控件,模拟一组设备的工作情况,通过 List...
摘要:创建窗口添加类为元素间空隙与主窗口创建过程相同,新建布局及控件,最后使用的方法显示出来。设置主窗口中的按钮事件,点击按钮后会显示一个窗口。这时我们可以通过函数设置窗口关闭时触发的事件在关闭窗口时,首先执行这一事件处理函数,再将窗口关闭。 前言 如今比较流行的桌面gui框架有WPF、WinForm、Qt、javafx等。其中WPF和WinForm目前还只能在运行Winsows上。Qt(w...
摘要:最近在用开发窗体程序,并且以后打算把所有的窗体软件切换到上面,并且还想用的各种好处,集成了就可以愉快的用各种服务了。最重要的是打包工具。由于我是,一般用和,执行命令会看到打包成了和两种类型的安装包。由于没有计算机,所以还不知道打包成的状态。 最近在用 JavaFx 开发窗体程序,并且以后打算把所有的窗体软件切换到 JavaFx 上面,并且还想用 springboot 的__各种好处,集...
匿名类 匿名类可以使你代码更简洁,它们使你能够同时声明和实例化一个类,它们就像局部类,除了它们没有名称,如果你只需要使用局部类一次,请使用它们。 声明匿名类 虽然局部类是类声明,但匿名类是表达式,这意味着你在另一个表达式中定义该类,以下示例HelloWorldAnonymousClasses在局部变量frenchGreeting和spanishGreeting的初始化语句中使用匿名类,但使用局部类...
摘要:背景项目需要做一个客户端的壳,内置浏览器,访问指定的采用技术开始吧环境配置略效果 背景 项目需要做一个客户端的壳,内置浏览器,访问指定 的url 采用技术 java 1.8 开始吧! java环境配置略 hello world import javafx.application.Application; import javafx.beans.value.ChangeListener;...
阅读 3511·2021-09-22 16:00
阅读 3614·2021-09-07 10:26
阅读 3185·2019-08-30 15:55
阅读 2946·2019-08-30 13:48
阅读 1428·2019-08-30 12:58
阅读 2255·2019-08-30 11:15
阅读 1056·2019-08-30 11:08
阅读 642·2019-08-29 18:41