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;
    }
}






  • 4
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值