基于swing实现窗体拖拽和拉伸
作者:_Thomas 发布时间:2023-11-12 22:32:40
标签:swing,拖拽,拉伸
本文为大家分享了swing实现窗体拖拽和拉伸的具体代码,供大家参考,具体内容如下
当用setUndecorated(true) 后 JFrame去掉标题栏后就得自己写拖拽和拉伸功能了。
下面是效果图,我的截图软件不能够截取除系统默认光标外的光标,所以各个方向光标变化在图中没有体现
代码如下:
import javax.swing.*;
import java.awt.*;
/**
* 窗体拖拽和拉伸
*/
public class winReSizeDemo {
private JFrame jf;
public winReSizeDemo(){
jf=new JFrame();
jf.setUndecorated(true);//去标边界和标题栏
jf.setLocationRelativeTo(null);//窗口置中
jf.setSize(400,400);
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
reSizeEvent dg = new reSizeEvent(jf);
/**添加两个 * **/
jf.addMouseListener(dg);
jf.addMouseMotionListener(dg);
jf.setVisible(true);
}
public static void main(String [] args){
new winReSizeDemo();
}
}
import javax.swing.*;
import java.awt.*;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
/**
* 实现窗口各个方向拉伸以及拖动。
*/
public class reSizeEvent extends MouseAdapter{
public JFrame jf;
private Point prePos,curPos,jfPos;
private static final double BREADTH = 15.0;//边界拉伸范围
private int dragType;
private static final int DRAG_MOVE = 1;
private static final int DRAG_UP = 2;
private static final int DRAG_UPLEFT = 3;
private static final int DRAG_UPRIGHT = 4;
private static final int DRAG_LEFT = 5;
private static final int DRAG_RIGHT = 6;
private static final int DRAG_BOTTOM = 7;
private static final int DRAG_BOTTOMLEFT = 8;
private static final int DRAG_BOTTOMRIGHT = 9;
public reSizeEvent(JFrame jf){
this.jf = jf;
}
@Override
public void mousePressed(MouseEvent e){
prePos = e.getLocationOnScreen();
}
@Override
public void mouseMoved(MouseEvent e){
areaCheck(e.getPoint());
}
@Override
public void mouseDragged(MouseEvent e){
curPos = e.getLocationOnScreen();
jfPos = jf.getLocation();
dragAction();
prePos = curPos;
}
private void dragAction(){
switch(dragType){
case DRAG_MOVE:
jf.setLocation(jfPos.x+curPos.x-prePos.x,
jfPos.y+curPos.y-prePos.y);
break;
case DRAG_UP://x位置不变,y位置变化,并且Height变化
jf.setLocation(jfPos.x,
jfPos.y+curPos.y-prePos.y);
jf.setSize(jf.getWidth(), jf.getHeight()-(curPos.y-prePos.y));
break;
case DRAG_LEFT://y位置不变,x位置变化,width变化
jf.setLocation(jfPos.x+curPos.x-prePos.x,
jfPos.y);
jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight());
break;
case DRAG_RIGHT://x,y位置不变,width变化
jf.setLocation(jfPos.x,
jfPos.y);
jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight());
break;
case DRAG_BOTTOM://x,y位置不变,Height变化
jf.setLocation(jfPos.x,
jfPos.y);
jf.setSize(jf.getWidth(), jf.getHeight()+(curPos.y-prePos.y));
break;
case DRAG_UPLEFT://x,y位置均变化,h,w均变化
jf.setLocation(jfPos.x+curPos.x-prePos.x,
jfPos.y+curPos.y-prePos.y);
jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
break;
case DRAG_BOTTOMRIGHT://x,y位置均不变,h,w变化
jf.setLocation(jfPos.x,
jfPos.y);
jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
break;
case DRAG_UPRIGHT://x位置不变,y,w,h变化
jf.setLocation(jfPos.x,
jfPos.y+curPos.y-prePos.y);
jf.setSize(jf.getWidth()+(curPos.x-prePos.x), jf.getHeight()-(curPos.y-prePos.y));
break;
case DRAG_BOTTOMLEFT://y不变,xwh变化
jf.setLocation(jfPos.x+curPos.x-prePos.x,
jfPos.y);
jf.setSize(jf.getWidth()-(curPos.x-prePos.x), jf.getHeight()+(curPos.y-prePos.y));
break;
default:
break;
}
}
private boolean areaCheck(Point p){
if(p.getX()<=BREADTH && p.getY()<=BREADTH){
dragType = DRAG_UPLEFT;
jf.setCursor(new Cursor(Cursor.NW_RESIZE_CURSOR));
}else if(p.getX()>BREADTH
&& p.getX()<(jf.getWidth()-BREADTH)
&& p.getY()<=BREADTH){
dragType = DRAG_UP;
jf.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR));
}else if(p.getX()>=(jf.getWidth()-BREADTH) && p.getY()<=BREADTH){
dragType = DRAG_UPRIGHT;
jf.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR));
}else if(p.getX()<=BREADTH
&& p.getY()<(jf.getHeight()-BREADTH)
&& p.getY()>BREADTH){
dragType = DRAG_LEFT;
jf.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR));
}else if(p.getX()>=(jf.getWidth()-BREADTH)
&& p.getY()<(jf.getHeight()-BREADTH)
&& p.getY()>BREADTH){
dragType = DRAG_RIGHT;
jf.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR));
}else if(p.getX()<=BREADTH
&& p.getY()>=(jf.getHeight()-BREADTH)){
dragType = DRAG_BOTTOMLEFT;
jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR));
}else if(p.getX()>BREADTH
&& p.getX()<(jf.getWidth()-BREADTH)
&& p.getY()>=(jf.getHeight()-BREADTH)){
dragType = DRAG_BOTTOM;
jf.setCursor(new Cursor(Cursor.S_RESIZE_CURSOR));
}else if(p.getX()>=(jf.getWidth()-BREADTH)
&& p.getY()>=(jf.getHeight()-BREADTH)){
dragType = DRAG_BOTTOMRIGHT;
jf.setCursor(new Cursor(Cursor.SE_RESIZE_CURSOR));
}else{
dragType = DRAG_MOVE;
jf.setCursor(new Cursor(Cursor.MOVE_CURSOR));
return false;
}
return true;
}
}
来源:http://blog.csdn.net/a694543965/article/details/78027743


猜你喜欢
- 关于迭代器你都知道什么?什么是迭代器?  所谓迭代的意思就是交换替代,迭代器并不是一种数据结构或者集合,
- 关闭时可使用如下代码public static void waitUntilTerminate(final ExecutorService
- 本文实例讲述了Android获取设备CPU核数、时钟频率以及内存大小的方法。分享给大家供大家参考,具体如下:因项目需要,分析了一下 Face
- 首先,通过代码定义一个委托和下面三个示例将要调用的方法:public delegate int AddHandler(int a,int b
- Android 自定义返回按钮的实例详解程序中我们有时候想让放回按钮按照自己的需求调整页面而不是单纯的按照系统返回上一级,这个问题很简单,重
- 程序调用自身的编程技巧称为递归( recursion)。递归做为一种算法在程序设计语言中广泛应用。 一个过程或函数在其定义或说明中有直接或间
- Singleton是众多设计模式中最容易理解的一种,也是众多设计模式中较为重要的一种设计模式。接下来我们看看具体介绍。Singleton模式
- 一、编码规则Base64编码的思想是是采用64个基本的ASCII码字符对数据进行重新编码。它将需要编码的数据拆分成字节数组。以3个字节为一组
- 我们通过一个完整的实例来实现课程信息管理功能的操作,包括查询、修改、删除课程信息的操作。为了简化实例,添加课程信息的操作直接在 SQL Se
- 整理文档,搜刮出一个SpringMvc MultipartFile实现图片文件上传示例,稍微整理精简一下做下分享。spring-servle
- 在J2EE项目的开发中,不管是对底层的数据库操作过程,还是业务层的处理过程,还是控制层的处理过程,都不可避免会遇到各种可预知的、不可预知的异
- 当使用struts2的validation.xml进行验证时,需要注意如下几个方面:I.首先应该注意validation.xml的名字,一定
- 本文实例讲述了C#异步调用的方法。分享给大家供大家参考。具体如下:using System;using System.Collections
- **********************************************************************
- 1 在图片上用鼠标进行操作,opencv主要用到setMouseCallback()函数。winname 窗口名称onMouse 鼠标事件的
- unity贪吃蛇基本原理实现,供大家参考,具体内容如下原理:1、每个身体跟着前面的身体移动;2、蛇头自动一直向前走,可以向左或者向右转弯。思
- 学习spring依赖注入的时候碰到这个坑,折腾了许久,记录一下以防其他小伙伴入坑!该异常主要原因是因为JDK与Spring版本不一致。要么更
- 一、数组的基本用法1.什么是数组数组:存储一组相同数据类型的数据的集合。2.定义数组 int[] :int类型数组 do
- jdk中自带了很多工具可以用于性能分析,位于jdk的bin目录下,jvisualvm工具可以以图形化的方式更加直观的监控本地以及远程的jav
- 1、背景一般情况下,有些搜索需求是需要根据拼音和中文来搜索的,那么在elasticsearch中是如何来实现基于拼音来搜索的呢?可以通过el