Swing技术----------组件重定位(完美实现)

7 篇文章 1 订阅
import java.awt.Cursor;
import java.awt.Point;
import java.awt.Rectangle;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;

import javax.swing.JButton;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.JList;
import javax.swing.JPanel;
import javax.swing.JTable;
import javax.swing.JTree;
class DnDAdapter extends MouseAdapter
{
    //每个组件的信息,在进入组件时获得。
    private JComponent jcom;
    private Point jcomOriginPoint;//组件在容器内的坐标
    private int jcomWidth,jcomHeight;
    //与定位、缩放相关信息
    private int a=10;//鼠标检测边沿大小
    private    Point pointMoved;//移动时,容器内坐标
    private CurType curCuror;//
    private enum  CurType {LeftTop,LeftBottom,RightTop,RightBottom,Top,Bottom,Left,Right,Center}
    //光标区域判断
    private  CurType getCurType(MouseEvent e)
    {
        Point p=e.getPoint();//getPoint返回组件内的坐标
        //左上角 0<x<a,0<y<a
        if((p.x>=0 && p.x<=a)&&(p.y>=0&&p.y<=a))
            return CurType.LeftTop;
        //右下角 w-a<x<w  h-a<y<h
        else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight))
            return CurType.RightBottom;
        //右上角w-a<x<w,0<y<a
        else if((p.x>=jcomWidth-a&&p.x<=jcomWidth)&&(p.y>=0&&p.y<=a))
            return CurType.RightTop;
        //左下角0<x<a,h-a<y<h
        else if((p.x>=0&&p.x<=a)&&(p.y>=jcomHeight-a&&p.y<=jcomHeight))
            return CurType.LeftBottom;
        //垂直:w-a<x<w && a<y<h-a 右边
        else if( p.x>=jcomWidth-a && p.x<=jcomWidth && p.y>=a && p.y<=jcomHeight-a)
            return CurType.Right;
        //垂直:0<x<a,a<y<h-a 左边
        else if(p.x>=0 && p.x<=a && p.y>=a && p.y<=jcomHeight-a)
            return CurType.Left;
        //水平 a<x<w-a && 0<y<a  上边
        else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=0&&p.y<=a)
            return CurType.Top;
        //水平 a<x<w-a &&h-a<y<h  下边
        else if((p.x>=a&&p.x<=jcomWidth-a) &&p.y>=jcomHeight-a&&p.y<=jcomHeight)
            return CurType.Bottom;
        //中间
        else
            //jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));//没有这句鼠标会一直保持形状
            return CurType.Center;
        
    }
    private void setCurType(MouseEvent e)
    {
    	switch(getCurType(e))
        {
        case LeftTop:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NW_RESIZE_CURSOR));
            curCuror=CurType.LeftTop;
            break;
        case LeftBottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SW_RESIZE_CURSOR));
            curCuror=CurType.LeftBottom;
            break;
        case RightTop:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.NE_RESIZE_CURSOR));
            curCuror=CurType.RightTop;
            break;
        case RightBottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.SE_RESIZE_CURSOR));
            curCuror=CurType.RightBottom;
            break;
        case Top:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
            curCuror=CurType.Top;
            break;
        case Bottom:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.N_RESIZE_CURSOR));
            curCuror=CurType.Bottom;
            break;
        case Left:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            curCuror=CurType.Left;
            break;
        case Right:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.E_RESIZE_CURSOR));
            curCuror=CurType.Right;
            break;
        default:
            jcom.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR));
            curCuror=CurType.Center;
            break;            
        }
    }
    private void setPosition(MouseEvent e)
    {
    	Point pointNow=e.getLocationOnScreen();
        int incX=pointNow.x-pointMoved.x;//增量是相对于最后一次移动的点。
        int incY=pointNow.y-pointMoved.y;
        ///
        //System.out.print("PointNow:("+pointNow.x+","+pointNow.y+")\t");
        //System.out.println("PointMoved:("+pointMoved.x+","+pointMoved.y+")\t");
        Rectangle rect=new Rectangle();
        switch(curCuror)
        {
        case LeftTop:
        	rect.x=jcomOriginPoint.x+incX;
        	rect.y=jcomOriginPoint.y+incY;
        	rect.width=jcomWidth-incX;
        	rect.height=jcomHeight-incY;
            break;
        case LeftBottom:
        	rect.x=jcomOriginPoint.x+incX;
        	rect.y=jcomOriginPoint.y;
        	rect.width=jcomWidth-incX;
        	rect.height=jcomHeight+incY;
            break;
        case RightTop:
        	rect.x=jcomOriginPoint.x;
        	rect.y=jcomOriginPoint.y+incY;
        	rect.width=jcomWidth+incX;
        	rect.height=jcomHeight-incY;
            break;
        case RightBottom:
        	rect.x=jcomOriginPoint.x;
        	rect.y=jcomOriginPoint.y;
        	rect.width=jcomWidth+incX;
        	rect.height=jcomHeight+incY;
            break;
            
        case Top:
        	rect.x=jcomOriginPoint.x;
        	rect.y=jcomOriginPoint.y+incY;
        	rect.width=jcomWidth;
        	rect.height=jcomHeight-incY;
            break;
        case Bottom:
        	rect.x=jcomOriginPoint.x;
        	rect.y=jcomOriginPoint.y;
        	rect.width=jcomWidth;
        	rect.height=jcomHeight+incY;
            break;
        case Left:
        	rect.x=jcomOriginPoint.x+incX;
        	rect.y=jcomOriginPoint.y;
        	rect.width=jcomWidth-incX;
        	rect.height=jcomHeight;
            break;
        case Right://右缩放
        	rect.x=jcomOriginPoint.x;
        	rect.y=jcomOriginPoint.y;
        	rect.width=jcomWidth+incX;
        	rect.height=jcom.getHeight();
            break;
            ///
        case Center://移动
        	rect.x=jcomOriginPoint.x+incX;
        	rect.y=jcomOriginPoint.y+incY;
        	rect.width=jcom.getWidth();//防止出现恢复原大小问题。
        	rect.height=jcom.getHeight();
            break;    
        default:
            break;            
        }
        jcom.setBounds(rect);
    }
    @Override
    public void mouseMoved(MouseEvent e) 
    {
       	pointMoved=e.getLocationOnScreen();
       	jcom=(JComponent)e.getSource();//防止抖动关键在这一点
        jcomOriginPoint=jcom.getLocation();//获取组件在父窗口的位置
        jcomWidth=jcom.getWidth();
        jcomHeight=jcom.getHeight();
//        System.out.print("Old--------------------");
//        System.out.print("Position:("+jcomOriginPoint.x+","+jcomOriginPoint.y+")\t");
//        System.out.println(" Width:"+jcomWidth+"  Height:"+jcomHeight);
        ///
        setCurType(e);
        //super.mouseMoved(e);
    }
    public void mouseDragged(MouseEvent e) 
    {
        //相对于移动最后一点的增量
    	setPosition(e);
        super.mouseDragged(e);
    }
}
public class App 
{
    public static void main(String[] args) 
    {
        JFrame frm=new JFrame();
        JPanel panel=new JPanel(null);
        frm.setSize(600    , 600);
        frm.setLocation(100, 100);
        frm.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        panel.setSize(600, 600);
        /
        JButton btn=new JButton("Button");
        btn.setSize(100, 100);
        btn.setLocation(100, 100);
        DnDAdapter dnd=new DnDAdapter();
        btn.addMouseMotionListener(dnd);
        //btn.addMouseListener(dnd);
        //btn.removeMouseMotionListener(l);
        panel.add(btn);
        frm.add(panel);    
        frm.setVisible(true);
        
    }

}

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值