鼠标拖拽移动Java界面组件

9/6/2015来源:Java教程人气:3086

鼠标拖拽移动java界面组件

  默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能。

  只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖拽移动窗口的目的呢?最开始,我简单的在mouseDragged方法里frame.setLocation(e.getX(), e.getY()),结果,frame拖拽的时候不停地闪烁,位置在屏幕上不断跳动。后来网上查资料,找到了答案。

这里给一个简单的示例,一看就明白:

  1 package com.jebysun.test.globalhotkey;  2   3 import java.awt.Color;  4 import java.awt.Cursor;  5 import java.awt.Point;  6 import java.awt.event.MouseEvent;  7   8 import javax.swing.JLabel;  9 import javax.swing.JWindow; 10 import javax.swing.event.MouseInputListener; 11  12 /** 13  * 自定义程序窗口,鼠标可拖拽移动其位置。 14  * @author Jeby Sun 15  * 16  */ 17 public class MyFrame extends JWindow { 18  19     PRivate static final long serialVersionUID = 1L; 20      21     JLabel titleLbl; 22      23     public MyFrame() { 24         //设置背景颜色不能直接调用其setBackground方法,而要设置其ContentPane的背景颜色。 25         this.getContentPane().setBackground(new Color(0x99FF66)); 26         this.setBounds(100,100,600,400); 27         this.setLayout(null); 28          29         titleLbl = new JLabel("  自定义窗口标题栏"); 30         titleLbl.setOpaque(true); 31         titleLbl.setBackground(new Color(0x66CC00)); 32         titleLbl.setBounds(0, 0, 600, 30); 33         this.add(titleLbl); 34         //鼠标事件处理类 35         MouseEventListener mouseListener = new MouseEventListener(this); 36         titleLbl.addMouseListener(mouseListener); 37         titleLbl.addMouseMotionListener(mouseListener); 38          39         this.setVisible(true); 40     } 41  42     /** 43      * 鼠标事件处理 44      * @author Jeby Sun 45      * 46      */ 47     class MouseEventListener implements MouseInputListener { 48          49         Point origin; 50         //鼠标拖拽想要移动的目标组件 51         MyFrame frame; 52          53         public MouseEventListener(MyFrame frame) { 54             this.frame = frame; 55             origin = new Point(); 56         } 57          58         @Override 59         public void mouseClicked(MouseEvent e) {} 60  61         /** 62          * 记录鼠标按下时的点 63          */ 64         @Override 65         public void mousePressed(MouseEvent e) { 66              origin.x = e.getX();   67              origin.y = e.getY(); 68         } 69  70         @Override 71         public void mouseReleased(MouseEvent e) {} 72  73         /** 74          * 鼠标移进标题栏时,设置鼠标图标为移动图标 75          */ 76         @Override 77         public void mouseEntered(MouseEvent e) { 78             this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); 79         } 80          81         /** 82          * 鼠标移出标题栏时,设置鼠标图标为默认指针 83          */ 84         @Override 85         public void mouseExited(MouseEvent e) { 86             this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); 87         } 88  89         /** 90          * 鼠标在标题栏拖拽时,设置窗口的坐标位置 91          * 窗口新的坐标位置  = 移动前坐标位置+(鼠标指针当前坐标-鼠标按下时指针的位置) 92          */ 93         @Override 94         public void mouseDragged(MouseEvent e) { 95             Point p = this.frame.getLocation(); 96             this.frame.setLocation( 97                 p.x + (e.getX() - origin.x),  98                 p.y + (e.getY() - origin.y));   99         }100 101         @Override102         public void mouseMoved(MouseEvent e) {}103         104     }105     106     107     public static void main(String[] args) {108         new MyFrame();109     }110 111 }