package xu.love.qq.component.board { import flash.display.DisplayObject; import flash.display.InteractiveObject; import flash.display.Sprite; import flash.events.MouseEvent; import org.aswing.JPanel; import org.aswing.LayoutManager; import org.aswing.geom.IntDimension; import org.aswing.geom.IntPoint; import org.aswing.geom.IntRectangle; import xu.love.qq.geom.AdsorbRectang; /** * 让JPanel可以自由拖动,不需要JFrame包装, * 添加一个backgroundInteract:InteractiveObject来包装backgroundChild监听鼠标事件 * 这是三个窗口的基类 * @author tangzx */ public class AbstractBoard extends JPanel { protected static var panes:Array = []; protected var originalSize:IntDimension; private var backgroundChild:DisplayObject; private var backgroundInteract:InteractiveObject;//backgroundInteract包装backgroundChild public function AbstractBoard(layout:LayoutManager = null) { super(layout); panes.push(this);//是为了方便对面板对象的引用吗? this.mouseChildren = true;//保证backgroundInteract监听鼠标事件 } protected var startDragLocalPoint:IntPoint; protected var startDragParentPoint:IntPoint; /** * 开始拖 * @param e * */ protected function checkStartDrag(e:MouseEvent):void{ if(getParent()) getParent().bringToTop(this); startDragLocalPoint = getLocation(); startDragParentPoint = new IntPoint(e.stageX, e.stageY);//getParent().getMousePosition(); stage.addEventListener(MouseEvent.MOUSE_UP, checkStopDrag); stage.addEventListener(MouseEvent.MOUSE_MOVE, checkMove); } /** * 拖动过程中 * @param e * */ protected function checkMove(e:MouseEvent):void{ var parentNowPoint:IntPoint = new IntPoint(e.stageX, e.stageY);//getParent().getMousePosition();得到舞台坐标 var localNowPoint:IntPoint = startDragLocalPoint.clone();//获得开始拖动的本地坐标 var localRect:IntRectangle = new IntRectangle;// //获拖动过程中的本地坐标 localNowPoint.move(parentNowPoint.x - startDragParentPoint.x, parentNowPoint.y - startDragParentPoint.y); localRect.setLocation(localNowPoint); localRect.setSize(getSize());//localRect作用在下面吸附里,打开就可执行 /*var adso:AdsorbRectang = new AdsorbRectang(localRect); for each(var pane:AbstractBoard in panes){ if(pane != this){ var r:IntPoint = adso.adsorb(pane.getBoundsRect(), 10, 10); if(r){ if(r.x != 0) localNowPoint.x = r.x; if(r.y != 0) localNowPoint.y = r.y; break; } } }*/ //更新组件拖动过程中的本地坐标 this.setLocation(localNowPoint); e.updateAfterEvent(); } /** * 停止拖动 * @param e * */ protected function checkStopDrag(e:MouseEvent):void{ stage.removeEventListener(MouseEvent.MOUSE_UP, checkStopDrag); stage.removeEventListener(MouseEvent.MOUSE_MOVE, checkMove); } /** * @see component.setBackgroundDecorator(bg:GroundDecorator) * @param child == bg.getDisplay(this) */ override protected function setBackgroundChild(child:DisplayObject=null):void{ if(child != backgroundChild){ if(backgroundChild){ removeChild(backgroundInteract); backgroundInteract = null; } backgroundChild = child; if(backgroundChild){ if(backgroundChild is InteractiveObject){ backgroundInteract = backgroundChild as InteractiveObject; } else { var s:Sprite = new Sprite; s.addChild(backgroundChild); backgroundInteract = s; } backgroundInteract.addEventListener(MouseEvent.MOUSE_DOWN, checkStartDrag); addChildAt(backgroundInteract, 0); } } } override protected function getBackgroundChild():DisplayObject { return backgroundChild; } /** * 初始大小 * @return * */ public function getOriginalSize():IntDimension { return originalSize; } public function setOriginalSize(size:IntDimension):void { originalSize = size; } public function getBoundsRect():IntRectangle{ return new IntRectangle(getX(), getY(), getWidth(), getHeight()); } } }