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();
}
}