JavaFx实现自定义窗口

效果

在这里插入图片描述

在这里插入图片描述

代码

package cn.juhe.zjsb.task;

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Rectangle2D;
import javafx.scene.Cursor;
import javafx.scene.Scene;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.layout.AnchorPane;
import javafx.scene.layout.HBox;
import javafx.scene.paint.Color;
import javafx.stage.Screen;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class Example extends Application {
    double xOffset, yOffset;
    @Override
    public void start(Stage primaryStage) {
        primaryStage.initStyle(StageStyle.TRANSPARENT);
        AnchorPane anchorPane = new AnchorPane();
        anchorPane.setStyle("-fx-background-color: lightblue; -fx-background-radius: 20;");
        anchorPane.setPrefHeight(300);
        anchorPane.setPrefWidth(400);
        Scene scene = new Scene(anchorPane);
        scene.setFill(Color.TRANSPARENT);
        // 实现拖拽功能
        anchorPane.setOnMousePressed(event -> {
            xOffset = event.getSceneX();
            yOffset = event.getSceneY();
        });

        anchorPane.setOnMouseDragged(event -> {
            primaryStage.setX(event.getScreenX() - xOffset);
            primaryStage.setY(event.getScreenY() - yOffset);
        });

        // 水平排列的按钮
        HBox hBox = new HBox(5);
        hBox.setLayoutX(5);
        hBox.setLayoutY(5);
        hBox.setPadding(new Insets(5));

        //图片的目录为/src/main/resources/cn/juhe/zjsb/img/close.png
        // 最小化按钮
        ImageView minImageView = createImage("min");
        // 关闭按钮
        ImageView closeImageView = createImage("close");
        // 最大化按钮
        ImageView fullImageView = createImage("full");

        HBox closeImageViewHBox = createHbox(closeImageView);
        HBox fullImageViewHBox = createHbox(fullImageView);
        HBox minImageViewHBox = createHbox(minImageView);

        //设置点击事件
        minImageViewHBox.setOnMouseClicked(event -> primaryStage.setIconified(true));
        closeImageViewHBox.setOnMouseClicked(event -> primaryStage.close());
        fullImageViewHBox.setPickOnBounds(true); // Add this line to enable mouse events on transparent areas
        fullImageViewHBox.setOnMouseClicked(event -> {
            if (primaryStage.isFullScreen()) {
                primaryStage.setFullScreen(false);
                // 重置窗口大小和位置为之前的设置
                primaryStage.setWidth(400);
                primaryStage.setHeight(300);
            } else {
                Screen screen = Screen.getPrimary();
                Rectangle2D bounds = screen.getVisualBounds();
                primaryStage.setX(bounds.getMinX());
                primaryStage.setY(bounds.getMinY());
                primaryStage.setWidth(bounds.getWidth());
                primaryStage.setHeight(bounds.getHeight());
                primaryStage.setFullScreen(true);
            }
        });

        //设置图片进入为手掌,之所以设置图片放在hbox中
        //是因为有的图片小,鼠标进入时,不会变为手掌形状
        setHandCursorOnMouseOver(closeImageViewHBox, fullImageViewHBox, minImageViewHBox);
        hBox.getChildren().addAll(minImageViewHBox, fullImageViewHBox, closeImageViewHBox);
        anchorPane.getChildren().add(hBox);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    HBox createHbox(ImageView i) {
        return new HBox(i);
    }

    ImageView createImage(String p) {
        ImageView mi = new ImageView(new Image(getClass().getResourceAsStream("/cn/juhe/zjsb/img/" + p + ".png")));
        mi.setFitWidth(20);
        mi.setFitHeight(20);
        return mi;
    }

    void setHandCursorOnMouseOver(HBox... h) {
        for (HBox c : h) {
            c.setOnMouseEntered(event -> c.getScene().setCursor(Cursor.HAND));
            c.setOnMouseExited(event -> c.getScene().setCursor(Cursor.DEFAULT));
        }
    }

    public static void main(String[] args) {
        launch(args);
    }
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mfbz.cn/a/45700.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

【Nodejs】文件上传

1.初始化准备 1.1 安装依赖 首先创建一个express-multer-upload工程项目,然后在项目中下好各种依赖包。 multer中间件 Multer 是一个 node.js 中间件,用于处理 multipart/form-data 类型的表单数据,它主要用于上传文件。 注意: Multer 不会…

【Ajax】笔记-JQuery发送请求与通用方法

Get请求 语法格式: $.get(url, [data], [callback], [type]) url:请求的 URL 地址。data:请求携带的参数。callback:载入成功时回调函数。type:设置返回内容格式,xml, html, script, json, text, _default。 准备三个按钮分别测试Get 、Post、通用型方…

概率论的学习和整理21:用EXCEL来做假设检验(未完成草稿)

目录 1 EXCEL可以用来做假设检验 1.1 如何打开 数据分析 和 规划求解 1.2 EXCEL里关于正态分布的准备知识 2 基本的假设检验 2.1 最基本的假设检验,单边的Z检验 2.1 双样本F检验 2.1.1 例题 2.1.2 进行F检验之前需要满足一些假设条件 2.1.3 计算步骤 2.1…

Langchain 新手完全指南

原文:Langchain 新手完全指南 Langchain 可能是目前在 AI 领域中最热门的事物之一,仅次于向量数据库。 它是一个框架,用于在大型语言模型上开发应用程序,例如 GPT、LLama、Hugging Face 模型等。 它最初是一个 Python 包&#x…

实战攻防Demo|如何轻松形成自动响应的安全闭环?

从威胁阻断角度来说,拦住黑客的第一步攻击尤为重要。同样,对于攻击者来说,第一步攻击的成本也往往是最高的。日常工作中人们会遇到很多类型的攻击,但暴力破解或者撞库攻击往往被作为黑客的第一步攻击。这主要源于其技术含量低&…

【网络教程】如何快速的解决WordPress“另一更新正在进行”的问题

文章目录 WordPress提示“另一更新正在进行”解决方案手动删除数据库记录使用插件WordPress提示“另一更新正在进行” 当我们在更新WordPress的插件或者升级WordPress时会出现后台提示“另一更新正在进行”,如下图 当我们点击更新后,出现下图提示 出现上述问题是由于在升级Wo…

平板用的触控笔什么牌子好?ipad第三方电容笔推荐

随着技术的发展,出现了各种各样的平板电容笔。一支好的电容笔,不但可以极大地提升我们的工作效率,还可以极大地提升我们的学习效果。平替的电容笔,无论是在技术方面,还是在质量方面,都还有很大的提升空间&a…

在家下载论文使用哪些论文下载工具比较好

在家下载论文如果不借助论文下载工具是非常艰难的事情,因为很多查找下载论文的数据库都是需要账号权限才可使用的。 例如,我们查找中文论文常用的知网、万方等数据库以及众多国外论文数据库。 在家下载知网、万方数据库论文可用下面的方法:…

Apache pulsar 技术系列-- 消息重推的几种方式

导语 Apache Pulsar 是一个多租户、高性能的服务间消息传输解决方案,支持多租户、低延时、读写分离、跨地域复制(GEO replication)、快速扩容、灵活容错等特性。在很多场景下,用户需要通过 MQ 实现消息的重新推送能力&#xff0c…

RTI无线电层析成像Matlab仿真数据生成

文章目录 概述初始化环境参数 概述 无线电层析成像是一种通过获取一定区域内多对相对固定的无线通信节点间的某种测量数据后,按照一定的数学处理方法,对区域内的障碍物目标以图像的形式 展现出来的成像技术。 开山之作: J. Wilson and N. Patwari, “Radio tomogra…

教师ChatGPT的23种用法

火爆全网的ChatGPT,作为教师应该如何正确使用?本文梳理了教师ChatGPT的23种用法,一起来看看吧! 1、回答问题 ChatGPT可用于实时回答问题,使其成为需要快速获取信息的学生的有用工具。 从这个意义上说,Cha…

天气越热越不能开空调,这是什么道理?

如今正值盛夏,炎热的太阳仿佛要把人烤化。相信很多小伙伴一回到家都会迫不及待地打开空调,在干爽的凉风中完成“自我复活”。然而需要警惕的是,相对密闭的空调房其实早已“暗藏杀机”,VOC、细菌、灰尘等室内“健康杀手”在房间里不…

Latex | 将MATLAB图并导入Latex中的方法

一、问题描述 用Latex时写paper时,要导入MATLAB生成的图进去 二、解决思路 (1)在MATLAB生成图片的窗口中,导出.eps矢量图 (2)把图上传到overleaf的目录 (3)在文中添加相应代码 三…

[ 容器 ] consul 容器服务更新与发现

目录 什么是服务注册与发现什么是consulconsul 部署consul 服务器 registrator服务器consul-templateconsul 多节点 什么是服务注册与发现 服务注册与发现是微服务架构中不可或缺的重要组件。起初服务都是单节点的,不保障高可用性,也不考虑服务的压力承…

ftp和sftp区别,以及xftp的使用

网上找链接找的很辛苦对吧! 网上下载的破解版还不用。而且用没多久又说要更新了,又得重新找。 这下直接把官方免费获取链接发给你,就不用在被这种事情麻烦了。 家庭/学校免费 - NetSarang Website (xshell.com):家庭/学校免费 - NetSarang W…

CAN bus off ——ISO11898

什么是can bus off? CAN总线关闭(CAN bus off)是指CAN节点进入一种错误状态,无法继续正常的数据通信。当一个CAN节点的错误计数器超过了设定的阈值时,该节点将进入CAN总线关闭状态。在这种状态下,该节点将停…

NoSQL之Redis配置与优化

目录 关系数据库和非关系数据库 关系型数据库 非关系型数据库 关系数据库和非关系数据库的区别 Redis安装部署 优点 Redis数据库常用命令 Redis持久化 Redis性能管理 非关系数据库产生背景 总结关系与非关系 了解redis redis优点 redis为什么这么快 1、线程池优化…

Doris(二) -通过外部表同步数据

前言 参考网址 1.官网 2.ODBC External Table Of Doris 3.Apache doris ODBC外表使用方式 第一步 创建 RESOURCE DROP RESOURCE IF EXISTS mysql_test_odbc; CREATE EXTERNAL RESOURCE mysql_test_odbc PROPERTIES ( "type" "odbc_catalog", "…

java 支持jsonschema

入参校验产品化 schema_xsd可视化编辑器_个人渣记录仅为自己搜索用的博客-CSDN博客 jsonchema的生成 支持v4的jackson-jsonSchema GitHub - mbknor/mbknor-jackson-jsonSchema: Generate JSON Schema with Polymorphism using Jackson annotations jackson-module-jsonSchema …

WPF实现DiagramChart

1、文件架构 2、FlowChartStencils.xaml <ResourceDictionary xmlns"http://schemas.microsoft.com/winfx/2006/xaml/presentation"xmlns:x"http://schemas.microsoft.com/winfx/2006/xaml"xmlns:s"clr-namespace:DiagramDesigner"xmlns:c&…