首页 > 其他分享 >如何制作一个无标题栏且可拖拽的窗口

如何制作一个无标题栏且可拖拽的窗口

时间:2023-06-13 11:23:35浏览次数:40  
标签:窗口 鼠标 标题栏 window root 拖拽

如何制作一个无标题栏且可拖拽的窗口

默认情况下,我们创建一个窗口自带有一个标题栏,标题栏上有程序的图标和标题,以及最小化、最大化、关闭按钮。

默认标题栏的样式比较固定,有时候为了自定义样式,就需要先隐藏默认的标题栏,然后自己制作一个。

同时有时还希望修改默认的拖拽窗口的方式(即按住标题栏拖动窗口),改成按住窗口空白区域即可拖拽。

下面的示例演示如何实现这些功能。

效果展示

示例代码

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.stage.StageStyle;

public class DragWindowExample extends Application
{
    private Stage window;
    private VBox root;
    private double offsetX;
    private double offsetY;

    private void makeRootDraggeble()
    {
        // 鼠标场景位置(offset) = 鼠标屏幕位置 - 窗口屏幕位置
        // 拖拽鼠标移动窗口,实质上就是鼠标场景位置(offset)不变,同时修改窗口屏幕位置
        // 因此拖拽时,令 窗口屏幕位置 = 鼠标屏幕位置 - 鼠标场景位置(offset)
        root.setOnMousePressed(e -> {
            offsetX = e.getSceneX();
            offsetY = e.getSceneY();
        });

        root.setOnMouseDragged(e -> {
            window.setX(e.getScreenX() - offsetX);
            window.setY(e.getScreenY() - offsetY);

            window.setOpacity(0.9);
        });

        root.setOnMouseReleased(e -> {
            window.setOpacity(1.0);
        });
    }

    @Override
    public void start(Stage window) throws Exception
    {
        this.window = window;

        root = new VBox();
        this.makeRootDraggeble();

        Button closeButton = new Button("X");
        closeButton.setOnAction(e -> window.close() );
        root.getChildren().add(closeButton);

        Scene scene = new Scene(root, 400, 300);

        window.setScene(scene);
        window.initStyle(StageStyle.TRANSPARENT);
        window.setTitle(this.getClass().getSimpleName());
        window.show();
    }

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

代码说明

我们通过这个代码隐藏默认标题栏:

window.initStyle(StageStyle.TRANSPARENT);

为了能按住空白区域拖动窗口,我们添加了一个功能函数:makeRootDraggeble ,函数中为主布局添加了对鼠标拖动事件的监听:

  1. 当鼠标按下时,记录当前鼠标的窗口坐标(即从窗口左上角为坐标原点的坐标)
  2. 当鼠标拖动时,修改窗口在显示屏上的坐标,修改的算法为:窗口屏幕位置 = 鼠标屏幕位置 - 鼠标场景位置(offset)

我们还添加了一个关闭按钮用于关闭窗口,否则用户没用办法正常关闭程序。

标签:窗口,鼠标,标题栏,window,root,拖拽
From: https://www.cnblogs.com/javafx-howto/p/17477014.html

相关文章

  • 拖拽表单设计器有什么功能?
    在办公流程化盛行的当下,拖拽表单设计器也拥有广阔的市场前景。传统表单由于效率低、制作不灵活等缺陷,使得其在办公职场中使用频率越来越低。随着低代码技术平台的快速发展,可视化拖拽式设计器功能越来越完善,也得到了广大新老客户朋友的喜爱和支持。接下来,我们就一起来了解这种表单......
  • C# 窗口鼠标穿透以及取消窗口鼠标穿透
     privateconstintWS_EX_TRANSPARENT=0x20;privateconstintGWL_EXSTYLE=-20;///<summary>///window扩展样式分层显示///</summary>privateconstintWS_EX_LAYERED=0x00080000;//取消鼠标穿透的......
  • vue实现简单的鼠标拖拽横向滚动 和 鼠标滚轮横向滚动
    一.鼠标拖拽滚动以下代码项目中直接使用即可,此种方法是通过鼠标拖拽进行滚动,滑动滚轮无效果。当然快捷键,shift+鼠标滚轮可以控制横向滚动,对用户来说体验不友好。<divclass="tab-listid="nav"><divclass="tab-item"v-for="(item,index)inlist":key=""></div></d......
  • Python实现定时自动关闭的tkinter窗口
    功能简要说明:程序运行后10秒钟自动关闭。技术要点:tkinter应用程序的destroy()方法,多线程编程。代码截图:运行效果:......
  • linux窗口管理工具 screen
    linux窗口管理工具-screen简明教程前言screen是一个用于命令行终端切换的自由软件。用户可以通过该软件同时连接多个本地或远程的命令行会话,并在其间自由切换。其操作非常简洁易懂,这里简要记录一下基本的使用方法。背景介绍GNUScreen是一款由GNU计划开发的用于命令行终......
  • 简单滑动窗口题目解析(c实现)
    下面的题目要使用的主要思路为滑动窗口,但是还需要使用哈希表来储存窗口中的元素个数题目一:无重复字符的最长子串题目一链接给定一个字符串 s ,请你找出其中不含有重复字符的 最长子串 的长度。示例 1:输入:s="abcabcbb"输出:3解释:因为无重复字符的最长子串是"abc",所......
  • Python+tkinter动态显示与隐藏窗口上的组件
    使用Python+tkinter创建应用程序窗口,根据需要动态显示和隐藏特定的组件。可能的应用场景:多个相似的功能共用同一个窗口,根据标志位来控制需要隐藏和显示哪些组件。如果整个界面在完成某个功能时完全不需要显示某个组件,也可以根据标志位的不同选择性地执行组件的place()方法。参考代......
  • 深入解析React DnD拖拽原理,轻松掌握拖放技巧!
    我们是袋鼠云数栈UED团队,致力于打造优秀的一站式数据中台产品。我们始终保持工匠精神,探索前端道路,为社区积累并传播经验价值。。本文作者:霁明一、背景1、业务背景业务中会有一些需要实现拖拽的场景,尤其是偏视觉方向以及移动端较多。拖拽在一定程度上能让交互更加便捷,能......
  • Unity3D:Project窗口
    推荐:将NSDT场景编辑器加入你的3D工具链3D工具集:NSDT简石数字孪生Project窗口“项目”窗口显示与项目相关的所有文件,是您在应用程序中导航和查找资源和其他项目文件的主要方式。默认情况下,当您启动新项目时,此窗口处于打开状态。但是,如果找不到它,或者它已关闭,您可以通过“常规>......
  • 怎么将C#通过发消息传递给指定C++窗口
    C#发送方//引入Interop库usingSystem.Runtime.InteropServices;//定义SendMessageAPI[DllImport("user32.dll",CharSet=CharSet.Auto,SetLastError=false)]staticexternIntPtrSendMessage(IntPtrhWnd,uintMsg,IntPtrwParam,IntPtrlParam);//......