基于swing實現(xiàn)窗體拖拽和拉伸
本文為大家分享了swing實現(xiàn)窗體拖拽和拉伸的具體代碼,供大家參考,具體內(nèi)容如下
當(dāng)用setUndecorated(true) 后 JFrame去掉標(biāo)題欄后就得自己寫拖拽和拉伸功能了。
下面是效果圖,我的截圖軟件不能夠截取除系統(tǒng)默認(rèn)光標(biāo)外的光標(biāo),所以各個方向光標(biāo)變化在圖中沒有體現(xiàn)
代碼如下:
import javax.swing.*; import java.awt.*; /** * 窗體拖拽和拉伸 */ public class winReSizeDemo { private JFrame jf; public winReSizeDemo(){ jf=new JFrame(); jf.setUndecorated(true);//去標(biāo)邊界和標(biāo)題欄 jf.setLocationRelativeTo(null);//窗口置中 jf.setSize(400,400); jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); reSizeEvent dg = new reSizeEvent(jf); /**添加兩個監(jiān)聽器**/ 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; /** * 實現(xiàn)窗口各個方向拉伸以及拖動。 */ 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; } }
以上就是本文的全部內(nèi)容,希望對大家的學(xué)習(xí)有所幫助,也希望大家多多支持腳本之家。
相關(guān)文章
Java 數(shù)據(jù)結(jié)構(gòu)與算法系列精講之時間復(fù)雜度與空間復(fù)雜度
對于一個算法,其時間復(fù)雜度和空間復(fù)雜度往往是相互影響的,當(dāng)追求一個較好的時間復(fù)雜度時,可能會使空間復(fù)雜度的性能變差,即可能導(dǎo)致占用較多的存儲空間,這篇文章主要給大家介紹了關(guān)于Java時間復(fù)雜度、空間復(fù)雜度的相關(guān)資料,需要的朋友可以參考下2022-02-02Java實現(xiàn)數(shù)字轉(zhuǎn)成英文的方法
這篇文章主要介紹了Java實現(xiàn)數(shù)字轉(zhuǎn)成英文的方法,涉及java數(shù)組與字符串的相關(guān)操作技巧,需要的朋友可以參考下2015-05-05Java高性能本地緩存框架Caffeine的實現(xiàn)
本文主要介紹了Java高性能本地緩存框架Caffeine的實現(xiàn),文中通過示例代碼介紹的非常詳細,具有一定的參考價值,感興趣的小伙伴們可以參考一下2022-02-02RocketMq同組消費者如何自動設(shè)置InstanceName
這篇文章主要介紹了RocketMq同組消費者如何自動設(shè)置InstanceName問題,具有很好的參考價值,希望對大家有所幫助,如有錯誤或未考慮完全的地方,望不吝賜教2024-06-06