如果对JFrame调用了方法setUndecorated(true);,那么窗体将没有标题栏,以及标题栏上的关闭、最大化、最小化菜单了。

这是要实现对鼠标的监控就必须自己手动去添加鼠标监听。下面代码就是实现对鼠标的监听,从而改变窗体的大小。(这里没有实现添加关闭、最大化、最小化按钮)

 
 /*** 监听鼠标事件,实现鼠标对窗体大小的改变* * @author mengke* @email wqjsir@foxmail.com* @version 1.0* @date 2012-2-25 下午10:45:48*/private class MouseInputHandler extends MouseInputAdapter {private static final int CORNER_DRAG_WIDTH = 10;private static final int BORDER_DRAG_THICKNESS = 5;/** 是否可移动窗体 */private boolean isMovingWindow;private boolean dragging;private int dragCursor;private int dragOffsetX;private int dragOffsetY;private int dragWidth;private int dragHeight;private MouseInputHandler() {}/*** 只处理鼠标左键按下操作*/@Overridepublic void mousePressed(MouseEvent e) {if (!SwingUtilities.isLeftMouseButton(e)) {return;}Point dragWindowOffset = e.getPoint();Window win = (Window) e.getSource();this.dragging = true;if (win != null) {/** 将窗体置前 */win.toFront();}Frame frame = (win instanceof Frame) ? (Frame) win : null;int frameState = frame != null ? frame.getExtendedState(): Frame.NORMAL;if (((frame != null) && ((frameState & Frame.MAXIMIZED_BOTH) == 0))) {this.isMovingWindow = true;this.dragOffsetX = dragWindowOffset.x;this.dragOffsetY = dragWindowOffset.y;}if (!this.isMovingWindow && frame != null && frame.isResizable()&& ((frameState & Frame.MAXIMIZED_BOTH) == 0)) {this.dragOffsetX = dragWindowOffset.x;this.dragOffsetY = dragWindowOffset.y;}this.dragWidth = win.getWidth();this.dragHeight = win.getHeight();this.dragCursor = getCursor(win, e);}@Overridepublic void mouseReleased(MouseEvent e) {if (!SwingUtilities.isLeftMouseButton(e)) {return;}if ((this.dragCursor != Cursor.DEFAULT_CURSOR)&& (!JRoundFrame.this.isValid())) {JRoundFrame.this.validate();}this.dragging = false;this.isMovingWindow = false;this.dragCursor = Cursor.DEFAULT_CURSOR;mouseMoved(e);}@Overridepublic void mouseMoved(MouseEvent e) {Window win = (Window) e.getSource();Frame frame = (win instanceof Frame) ? (Frame) win : null;int cursor = getCursor(win, e);if ((cursor != 0)&& (win.getBounds().contains(e.getLocationOnScreen()))&& ((frame != null) && (frame.isResizable()) && ((frame.getExtendedState() & Frame.MAXIMIZED_BOTH) == 0))) {win.setCursor(Cursor.getPredefinedCursor(cursor));} else {win.setCursor(Cursor.getDefaultCursor());}}@Overridepublic void mouseExited(MouseEvent e) {if (!this.dragging) {Window win = (Window) e.getSource();win.setCursor(Cursor.getDefaultCursor());}}@Overridepublic void mouseDragged(MouseEvent e) {if (!SwingUtilities.isLeftMouseButton(e)) {if (JRoundFrame.this.getBounds().contains(e.getPoint())) {mouseMoved(e);} else {mouseExited(e);}return;}Window win = (Window) e.getSource();Point point = e.getPoint();if (this.isMovingWindow && this.dragCursor == Cursor.DEFAULT_CURSOR) {Point eventLocationOnScreen = e.getLocationOnScreen();win.setLocation(eventLocationOnScreen.x - this.dragOffsetX,eventLocationOnScreen.y - this.dragOffsetY);} else if (this.dragCursor != Cursor.DEFAULT_CURSOR) {Rectangle rect = win.getBounds();Rectangle startBounds = new Rectangle(rect);Dimension min = win.getMinimumSize();Dimension max = win.getMaximumSize();switch (this.dragCursor) {case Cursor.E_RESIZE_CURSOR:adjust(rect, min, max, 0, 0, point.x+ (this.dragWidth - this.dragOffsetX) - rect.width,0);break;case Cursor.S_RESIZE_CURSOR:adjust(rect, min, max, 0, 0, 0, point.y+ (this.dragHeight - this.dragOffsetY)- rect.height);break;case Cursor.N_RESIZE_CURSOR:adjust(rect, min, max, 0, point.y - this.dragOffsetY, 0,-(point.y - this.dragOffsetY));break;case Cursor.W_RESIZE_CURSOR:adjust(rect, min, max, point.x - this.dragOffsetX, 0,-(point.x - this.dragOffsetX), 0);break;case Cursor.NE_RESIZE_CURSOR:adjust(rect, min, max, 0, point.y - this.dragOffsetY,point.x + (this.dragWidth - this.dragOffsetX)- rect.width, -(point.y - this.dragOffsetY));break;case Cursor.SE_RESIZE_CURSOR:adjust(rect, min, max, 0, 0, point.x+ (this.dragWidth - this.dragOffsetX) - rect.width,point.y + (this.dragHeight - this.dragOffsetY)- rect.height);break;case Cursor.NW_RESIZE_CURSOR:adjust(rect, min, max, point.x - this.dragOffsetX, point.y- this.dragOffsetY, -(point.x - this.dragOffsetX),-(point.y - this.dragOffsetY));break;case Cursor.SW_RESIZE_CURSOR:adjust(rect, min, max, point.x - this.dragOffsetX, 0,-(point.x - this.dragOffsetX), point.y+ (this.dragHeight - this.dragOffsetY)- rect.height);break;}if (!rect.equals(startBounds)) {win.setBounds(rect);if (Toolkit.getDefaultToolkit().isDynamicLayoutActive()) {win.validate();JRoundFrame.this.getRootPane().repaint();}}}}/*** 鼠标左键点击事件*/@Overridepublic void mouseClicked(MouseEvent e) {if (!SwingUtilities.isLeftMouseButton(e)) {return;}Window win = (Window) e.getSource();Frame frame = (win instanceof Frame) ? (Frame) win : null;Point point = e.getPoint();int clickCount = e.getClickCount();if ((clickCount % 2 == 0)&& (point.x <= 22)&& (point.y <= 22)&& (JRoundFrame.this.getRootPane().getWindowDecorationStyle() != 0)) {JRoundFrame.this.dispatchEvent(new WindowEvent(JRoundFrame.this, WindowEvent.WINDOW_CLOSING));return;}if (frame == null) {return;}int state = frame.getExtendedState();Window fullWin = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice().getFullScreenWindow();if ((frame.isResizable()) && (frame != fullWin)&& (clickCount % 2 == 0)) {if ((state & Frame.MAXIMIZED_BOTH) != 0) {frame.setExtendedState(state & 0xFFFFFFF9);} else {frame.setExtendedState(state | Frame.MAXIMIZED_BOTH);}}}private void adjust(Rectangle bounds, Dimension min, Dimension max,int deltaX, int deltaY, int deltaWidth, int deltaHeight) {bounds.x += deltaX;bounds.y += deltaY;bounds.width += deltaWidth;bounds.height += deltaHeight;if (min != null) {if (bounds.width < min.width) {int correction = min.width - bounds.width;if (deltaX != 0) {bounds.x -= correction;}bounds.width = min.width;}if (bounds.height < min.height) {int correction = min.height - bounds.height;if (deltaY != 0) {bounds.y -= correction;}bounds.height = min.height;}}if (max != null) {if (bounds.width > max.width) {int correction = max.width - bounds.width;if (deltaX != 0) {bounds.x -= correction;}bounds.width = max.width;}if (bounds.height > max.height) {int correction = max.height - bounds.height;if (deltaY != 0) {bounds.y -= correction;}bounds.height = max.height;}}}private int getCursor(Window win, MouseEvent e) {int winWidth = win.getBounds().width;int winHeight = win.getBounds().height;Point p = e.getPoint();// e.getLocationOnScreen();if (win.getBounds().contains(e.getLocationOnScreen())) {// 先判断四个角if (p.x - CORNER_DRAG_WIDTH < 0 && p.y - CORNER_DRAG_WIDTH < 0) {return Cursor.NW_RESIZE_CURSOR;} else if (p.x - (winWidth - CORNER_DRAG_WIDTH) > 0&& p.y - CORNER_DRAG_WIDTH < 0) {return Cursor.NE_RESIZE_CURSOR;} else if (p.x - CORNER_DRAG_WIDTH < 0&& p.y - (winHeight - CORNER_DRAG_WIDTH) > 0) {return Cursor.SW_RESIZE_CURSOR;} else if (p.x - (winWidth - CORNER_DRAG_WIDTH) > 0&& p.y - (winHeight - CORNER_DRAG_WIDTH) > 0) {return Cursor.SE_RESIZE_CURSOR;}// 判断是否在中间部分if ((p.x > BORDER_DRAG_THICKNESS && p.x < winWidth- BORDER_DRAG_THICKNESS)&& (p.y > BORDER_DRAG_THICKNESS && p.y < winHeight- BORDER_DRAG_THICKNESS)) {return Cursor.DEFAULT_CURSOR;} else {if (p.x - BORDER_DRAG_THICKNESS < 0) {return Cursor.W_RESIZE_CURSOR;} else if (p.y - BORDER_DRAG_THICKNESS < 0) {return Cursor.N_RESIZE_CURSOR;} else if (winWidth - BORDER_DRAG_THICKNESS > p.x) {return Cursor.S_RESIZE_CURSOR;} else {return Cursor.E_RESIZE_CURSOR;}}}return Cursor.DEFAULT_CURSOR;}}


其中JRoundFrame为继承JFrame类的类。在该类的构造方法中添加该鼠标监听,就能实现鼠标对该窗体的大小的改变了。

不对窗体进行边框装饰后,实现对鼠标事件的监控相关推荐

  1. WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题

    WPF 触屏事件后触发鼠标事件的问题及 DataGrid 误触问题 目录 一.触屏事件连带触发鼠标事件的问题 二.DataGrid 误触问题及解决方法 独立观察员 2021 年 10 月 10 日 一 ...

  2. PyQt5 Qt 窗体去边框,去边框后可移动

    有时为了制作工具条,或者其他特殊美化需求,需要把窗体的边框去掉,但是边框去掉后窗体无法移动.接下来解决如何移动去掉边框后的窗体. 说明:如果一个窗体去边框后,又设置了透明背景,那么窗体本身就不能监测鼠 ...

  3. python装饰器原理wraps(method)(self)_python装饰器中@wraps作用--修复被装饰后的函数名等属性的改变...

    Python装饰器(decorator)在实现的时候,被装饰后的函数其实已经是另外一个函数了(函数名等函数属性会发生改变),为了不影响,Python的functools包中提供了一个叫wraps的de ...

  4. 【最终版】PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口

    [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化,添加内容窗口 文章目录 [最终版]PyQt5 自定义标题栏,实现无边框,最小化最大 ...

  5. PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化

    PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变大小,仿百度网盘色调美化 文章目录 PyQt5 自定义标题栏,实现无边框,最小化最大化关闭事件,窗口拖动移动,窗口改变 ...

  6. 安装ATi显卡驱动后增加的鼠标右键菜单的清理

    一般最直接的方法是: 一般位于注册表的: 删除注册表HKEY_CLASSES_ROOT\Directory \Background\shellex\ContextMenuHandlers\ACE下 a ...

  7. layui表格点击排序按钮后,表格绑定事件失效解决方法

    layui表格点击排序按钮后,表格绑定事件失效解决方法 参考文章: (1)layui表格点击排序按钮后,表格绑定事件失效解决方法 (2)https://www.cnblogs.com/gongliha ...

  8. WPF安装打印机驱动后PrintDialog 执行打印事件

    原文:WPF安装打印机驱动后PrintDialog 执行打印事件 WPF可以很好的利用流文档来实现打印预览和PrintDialog 实现打印功能,但是我在这只是写了一个很简单的打印功能演示. Page ...

  9. win10电脑黑屏只有鼠标箭头_电脑黑屏后屏幕只有鼠标怎么办呢?

     点击上方蓝字关注我们呢^_^ 电脑黑屏后屏幕只有鼠标怎么办呢?我们在开机后只看到屏幕上面有一个鼠标图标可以移动,不管键盘如何敲击都没有其他反应,怎么办呢? 一.通过任务管理器解决 1.出现这样的黑屏 ...

最新文章

  1. dhrystone测试结果_RTThread软件包可以对MCU进行性能测试,跑一个试试!
  2. devops之路rancher安装
  3. 执行import xlrd,报错ModuleNotFoundError: No module named 'xlrd'
  4. Linux 0.11内核分析01:概述
  5. Xamarin 技术全解析
  6. C++ 设计模式之Static Factory模式(简单工厂模式)
  7. 深入浅出Mysql 读书笔记
  8. EnableViewState详细分析
  9. 【内网安全】——内网主机发现
  10. 夏日闪电惊雷想念父亲
  11. VC中 WM_SHOWWINDOW 与ShowWindow()的区别
  12. MapReduce基本概述——分布式计算框架
  13. C语言设计程序(第二版)
  14. Mysql数据库-初识Mysql
  15. 软件工程大作业——在线零食销售系统
  16. 一文搞懂 神经辐射场(Neural Radiance Fields,NeRF)
  17. CC2640R2f 看门狗
  18. Linux文件的切割与合并
  19. 中国电信ChinaNet骨干网大区片区和省级节点
  20. 【板栗糖GIS】VR—如何使用PS修改全景图

热门文章

  1. C++天气预报小软件
  2. K2 BPM_“流程平台可以解决哪些问题?”,企业关心的都在这里(二)
  3. hihocoder1636-Pangu and Stones
  4. Android开发-基于ijkplayer框架开发网络电视直播播放器的实现
  5. 十年磨一剑,匠心打造中国人自己的网络编程架构t-io
  6. 摄像机Rtsp地址格式大全
  7. 各版本Eclipse安装WindowBuilder
  8. 锤子手机获工信部入网许可:清晰照曝光
  9. 平流式沉淀池流量计算_平流沉淀池设计计算
  10. HCIP:rip综合实验