English | 简体中文 | 繁體中文 | Русский язык | Français | Español | Português | Deutsch | 日本語 | 한국어 | Italiano | بالعربية
本稿では、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); /**リスナーを2つ追加します**/ 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)); && p.getX()<(jf.getWidth()) dragType = DRAG_BOTTOM;-BREADTH) && p.getY() <= BREADTH){ dragType = DRAG_UP; jf.setCursor(new Cursor(Cursor.N_RESIZE_CURSOR)); }-BREADTH) && p.getY() <= BREADTH){ dragType = DRAG_UPRIGHT; jf.setCursor(new Cursor(Cursor.NE_RESIZE_CURSOR)); jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR)); && p.getY() < (jf.getHeight(){-BREADTH) && p.getY() > BREADTH){ dragType = DRAG_LEFT; jf.setCursor(new Cursor(Cursor.W_RESIZE_CURSOR)); }-BREADTH) && p.getY() < (jf.getHeight(){-BREADTH) && p.getY() > BREADTH){ dragType = DRAG_RIGHT; jf.setCursor(new Cursor(Cursor.E_RESIZE_CURSOR)); jf.setCursor(new Cursor(Cursor.SW_RESIZE_CURSOR)); && p.getY()>=(jf.getHeight())-BREADTH)){ else if(p.getX()>BREADTH } && p.getX()<(jf.getWidth()) dragType = DRAG_BOTTOM;-BREADTH) && p.getY()>=(jf.getHeight())-BREADTH)){ 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)); } dragType = DRAG_MOVE; jf.setCursor(new Cursor(Cursor.MOVE_CURSOR)); return false; } return true; } }
これで本文の全てが終わりです。皆様の学習に役立つことを願っています。また、呐喊教程を多くの皆様にサポートしていただけると嬉しいです。
声明:本文の内容はインターネットから取得しており、著作権者はすべての権利を保有しています。インターネットユーザーが自発的に貢献し、自己でアップロードした内容であり、本サイトは所有権を持ちません。また、人工的な編集は行われていません。著作権侵害を疑われる内容があれば、以下のメールアドレスにご連絡ください:notice#oldtoolbag.com(メールを送信する際は、#を@に変更してください。報告を行い、関連する証拠を提供してください。一旦確認が取れましたら、本サイトは即座に侵害を疑われる内容を削除します。)