在swing编程中,要拖动一个JFrame,是要在窗体标题那里按住鼠标才可以拖动它的。但有时,我们需要鼠标在窗体里面就能够拖动这个窗体,就像QQ的聊天窗口一样。另一方面,我们可能会对一个JFrame去掉窗体修饰(调用setUndecorated(true)方法),这时候貌似就不能拖动窗体了。
添加窗体拖动的思路很简单,给它添加一个鼠标监听器。重写MouseAdapter的几个方法。一个是mousePressed,表示鼠标按下,在此获取鼠标按下时的坐标;一个是mouseDragged,表示鼠标拖动,在此获取此时鼠标和窗体的坐标,并计算出窗体应该出现的坐标并调用其setLocation方法。我已经将其封装,代码实现如下:
/** * 对指定 JFrame 对象添加拖动监听器。 * * @param frame JFrame对象 */ public static void addMouseDraggedActionListener(final JFrame frame) { final Point origin = new Point(); frame.addMouseListener(new MouseAdapter() { public void mousePressed(MouseEvent e) { origin.x = e.getX(); //当鼠标按下的时候获得窗口当前的位置 origin.y = e.getY(); } }); frame.addMouseMotionListener(new MouseMotionAdapter() { public void mouseDragged(MouseEvent e) { Point p = frame.getLocation(); //窗口当前的位置 + 鼠标当前在窗口的位置 - 鼠标按下的时候在窗口的位置 frame.setLocation(p.x + e.getX() - origin.x, p.y + e.getY() - origin.y); } }); }
上面代码已被收录在我的diaoxianSoft中的easyJFC包中。此包暂未完善,亦未做正规测试,不知其有多大通用性,仅作为我个人的私有包,在自己写代码中使用。
JFC系列将分享一些常见但又让我们这些新手头疼的问题的解决方法,希望大家继续关注,也希望大家一起分享自己的成果。