افتراضيًا، يقوم Frame أو JFrame نفسه بتنفيذ وظيفة تحريك النافذة عن طريق سحب شريط العنوان بالماوس.
ومع ذلك، عندما لا تكون راضيًا عن نمط JFrame الخاص بـ Java، أو إخفاء شريط العنوان والحدود، أو ببساطة استخدام JWindow مباشرة، فكيف يمكنك تحقيق الغرض من تحريك النافذة عن طريق سحب الماوس؟ في البداية، استخدمت ببساطةframe.setLocation(e.getX(), e.getY()) في طريقة mouseDragged، ونتيجة لذلك، استمر الإطار في الوميض عندما قمت بسحبه، واستمر الموضع في القفز على الشاشة. لاحقًا، بحثت عن المعلومات عبر الإنترنت ووجدت الإجابة.
فيما يلي مثال بسيط سيكون من السهل فهمه في لمحة:
package com.jebysun.test.globalhotkey; import java.awt.Color; import java.awt.Point; import java.awt.event.MouseEvent; .JWindow; import javax.swing.event.MouseInputListener; /** * تخصيص نافذة البرنامج، ويمكن سحب الماوس لتحريك موضعه. * @author Jeby Sun * */ public class MyFrame Extends JWindow { Private static Final long serialVersionUID = 1L; JLabel titleLbl; public MyFrame() { // لتعيين لون الخلفية، لا يمكنك استدعاء طريقة setBackground الخاصة به مباشرةً، ولكن قم بتعيين الخلفية لون ContentPane الخاص به. this.getContentPane().setBackground(new Color(0x99FF66)); this.setBounds(100,100,600,400); this.setLayout(null); .setBackground(new Color(0x66CC00)); titleLbl.setBounds(0, 0, 600, 30); this.add(titleLbl); // فئة معالجة حدث الماوس MouseEventListener = new MouseEventListener(this); .setVisible(true); } /** * التعامل مع حدث الماوس* @author Jeby Sun * */ class MouseEventListener Implements MouseInputListener { Point Origin; // اسحب المكون الهدف الذي تريد نقله باستخدام إطار الماوس public MouseEventListener(MyFrameframe) { this.frame = new Point(); public void mouseClicked(MouseEvent e) {} /** * سجل النقطة عند الضغط على الماوس*/ @Override public void mousePressed(MouseEvent e) { Origin.x = e.getX(); Origin.y = e.getY(); } @Override public void mouseReleased(MouseEvent e) {} /** * عندما يتحرك الماوس إلى شريط العنوان، اضبط رمز الماوس على رمز الهاتف المحمول* / @Override public void mouseEntered(MouseEvent e) { this.frame.setCursor(Cursor.getPrefiniteCursor(Cursor.MOVE_CURSOR) } /** * عندما يتحرك الماوس خارج شريط العنوان، قم بتعيين رمز الماوس كمؤشر افتراضي */ @Override public void mouseExited(MouseEvent e) { this.frame.setCursor(Cursor.getPrefiniteCursor(Cursor.DEFAULT_CURSOR) } /** * اسحب الماوس على شريط العنوان عند السحب، قم بتعيين الموضع الإحداثي للنافذة * الموضع الإحداثي الجديد للنافذة = موضع الإحداثيات قبل التحرك + (الإحداثيات الحالية لمؤشر الماوس - موضع المؤشر عند تحريك الماوس يتم الضغط عليه) */ @Override public void mouseDragged(MouseEvent e) { Point p = this.frame.getLocation(); this.frame.setLocation( px + (e.getX() - Origin.x), py + (e.getY() - Origin. y)); } @Override public void mouseMoved(MouseEvent e) {} } public static void main(String[] args) { new MyFrame() } };