Java实现鼠标拖拽移动界面组件
默认的,Frame或者JFrame自身已经实现了鼠标拖拽标题栏移动窗口的功能。
只是,当你不满意java的JFrame样式,隐藏了标题栏和边框,又或者干脆直接使用JWindow,那你又该怎么实现鼠标拖拽移动窗口的目的呢?最开始,我简单的在mouseDragged方法里frame.setLocation(e.getX(),e.getY()),结果,frame拖拽的时候不停地闪烁,位置在屏幕上不断跳动。后来网上查资料,找到了答案。
这里给一个简单的示例,一看就明白:
packagecom.jebysun.test.globalhotkey; importjava.awt.Color; importjava.awt.Cursor; importjava.awt.Point; importjava.awt.event.MouseEvent; importjavax.swing.JLabel; importjavax.swing.JWindow; importjavax.swing.event.MouseInputListener; /** *自定义程序窗口,鼠标可拖拽移动其位置。 *@authorJebySun * */ publicclassMyFrameextendsJWindow{ privatestaticfinallongserialVersionUID=1L; JLabeltitleLbl; publicMyFrame(){ //设置背景颜色不能直接调用其setBackground方法,而要设置其ContentPane的背景颜色。 this.getContentPane().setBackground(newColor(0x99FF66)); this.setBounds(100,100,600,400); this.setLayout(null); titleLbl=newJLabel("自定义窗口标题栏"); titleLbl.setOpaque(true); titleLbl.setBackground(newColor(0x66CC00)); titleLbl.setBounds(0,0,600,30); this.add(titleLbl); //鼠标事件处理类 MouseEventListenermouseListener=newMouseEventListener(this); titleLbl.addMouseListener(mouseListener); titleLbl.addMouseMotionListener(mouseListener); this.setVisible(true); } /** *鼠标事件处理 *@authorJebySun * */ classMouseEventListenerimplementsMouseInputListener{ Pointorigin; //鼠标拖拽想要移动的目标组件 MyFrameframe; publicMouseEventListener(MyFrameframe){ this.frame=frame; origin=newPoint(); } @Override publicvoidmouseClicked(MouseEvente){} /** *记录鼠标按下时的点 */ @Override publicvoidmousePressed(MouseEvente){ origin.x=e.getX(); origin.y=e.getY(); } @Override publicvoidmouseReleased(MouseEvente){} /** *鼠标移进标题栏时,设置鼠标图标为移动图标 */ @Override publicvoidmouseEntered(MouseEvente){ this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.MOVE_CURSOR)); } /** *鼠标移出标题栏时,设置鼠标图标为默认指针 */ @Override publicvoidmouseExited(MouseEvente){ this.frame.setCursor(Cursor.getPredefinedCursor(Cursor.DEFAULT_CURSOR)); } /** *鼠标在标题栏拖拽时,设置窗口的坐标位置 *窗口新的坐标位置=移动前坐标位置+(鼠标指针当前坐标-鼠标按下时指针的位置) */ @Override publicvoidmouseDragged(MouseEvente){ Pointp=this.frame.getLocation(); this.frame.setLocation( p.x+(e.getX()-origin.x), p.y+(e.getY()-origin.y)); } @Override publicvoidmouseMoved(MouseEvente){} } publicstaticvoidmain(String[]args){ newMyFrame(); } }