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

来源:互联网 发布:狄威周比利 知乎 编辑:程序博客网 时间:2024/06/01 09:44
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);            }}

原创粉丝点击