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

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。

(0)

相关推荐

  • java swing中实现拖拽功能示例

    java实现拖拽示例 Swing中实现拖拽功能,代码很简单,都有注释,自己看,运行效果如下图: 复制代码 代码如下: package com; import java.awt.*;import java.awt.datatransfer.DataFlavor;import java.awt.dnd.DnDConstants;import java.awt.dnd.DropTarget;import java.awt.dnd.DropTargetAdapter;import java.awt.dn

  • 基于swing实现窗体拖拽和拉伸

    本文为大家分享了swing实现窗体拖拽和拉伸的具体代码,供大家参考,具体内容如下 当用setUndecorated(true) 后 JFrame去掉标题栏后就得自己写拖拽和拉伸功能了. 下面是效果图,我的截图软件不能够截取除系统默认光标外的光标,所以各个方向光标变化在图中没有体现 代码如下: import javax.swing.*; import java.awt.*; /** * 窗体拖拽和拉伸 */ public class winReSizeDemo { private JFrame j

  • JS基于面向对象实现的拖拽功能示例

    本文实例讲述了JS基于面向对象实现的拖拽功能.分享给大家供大家参考,具体如下: <html xmlns="http://www.w3.org/1999/xhtml"> <head> <style> #div1 {width:100px; height:100px; background:red; position:absolute;} #div2 {width:100px; height:100px; background:yellow; posit

  • JS基于面向对象实现的拖拽库实例

    本文实例讲述了JS基于面向对象实现的拖拽库.分享给大家供大家参考.具体如下: 这是一个面向对象的JS拖拽库,可设置水平锁定.垂直锁定.锁定位置.锁定范围等,设定这些范围后,只能在设定的模式下拖动,我觉得这是个挺不错的拖拽实例. 运行效果截图如下: 在线演示地址如下: http://demo.jb51.net/js/2015/js-mxdx-draw-plug-codes/ 具体代码如下: <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transi

  • 基于Vue实现可以拖拽的树形表格实例详解

    因业务需求,需要一个树形表格,并且支持拖拽排序,任意未知插入,github搜了下,真不到合适的,大部分树形表格都没有拖拽功能,所以决定自己实现一个.这里分享一下实现过程,项目源代码请看github,插件已打包封装好,发布到npm上 本博文会分为两部分,第一部分为使用方式,第二部分为实现方式 安装方式 npm i drag-tree-table --save-dev 使用方式 import dragTreeTable from 'drag-tree-table'  模版写法 <dragTreeTa

  • python 基于selenium实现鼠标拖拽功能

    1.准备html文件 首先我们需要准备一个鼠标滑动的html文件,用来演示鼠标滑动的效果,注意需要将我们的html文件放在自己的服务器上, 这样我们才能够通过selenium来进行验证.html文件如下: <html> <head> <meta charset="utf-8" /> <style> body { margin: 0; padding: 0; } input{ appearance:none; -moz-appearance

  • C#组件FormDragger窗体拖拽器详解

    适用:.net2.0+ winform项目 介绍: 类似QQ.迅雷等讲究UI体验的软件,都支持在窗口内多处地方拖动窗口,而不必老实巴交的去顶部标题栏拖,这个组件就是让winform也能这样随性拖拽,随性度或更甚.先看效果: 可拖拽的地方包括不限于: 窗体.Panel.GroupBox.TabControl等容器控件的空白区: 菜单栏.工具栏.状态栏等bar的空白区,以及无效项目: Label.PictureBox.ProgressBar等通常不与鼠标交互的控件: 一切无效控件(Enabled为f

  • Vue自定义指令实现弹窗拖拽四边拉伸及对角线拉伸效果

    引言 近期公司vue前端项目需求:实现弹窗的拖拽,四边拉伸及对角线拉伸,以及弹窗边界处理.本人使用vue的自定义指令编写了drag.js文件分享给大家一起学习,以下代码是本人提取出来的示意demo,仅供参考.这是本人前端小白的第一篇技术分享,如有错误的地方,请大家批评指正! 页面布局 <template> <div class="parameter" v-dialogDrag > <div class="title">标题 <

  • 基于jquery插件实现拖拽删除图片功能

    本文实例为大家分享了jquery插件实现拖拽删除图片功能的具体代码,供大家参考,具体内容如下 实现以下效果 完全拖出这个层,图片会消失,否则图片会回到原来的位置 <html> <head> <title></title> <style type="text/css"> #mydiv{ width:900px; background-color:#444; border:1px solid red} #mydiv2{ width

  • 基于jquery的一个拖拽到指定区域内的效果

    这个可与前两个不同了,这个是拖拽到指定的区域内的特效.其实逻辑方式差不多,只不过不同的是 找到目标元素,用appendTo 的方法插入到目标元素. 具体的代码如下,有兴趣者可以试下.(由于是初学,做的简单,如果有其他的方法请给下指点,我定感激不尽哈...) 复制代码 代码如下: <!DOCTYPE HTML> <html> <head> <meta http-equiv="Content-Type" content="text/htm

随机推荐