zoukankan      html  css  js  c++  java
  • JPanel

    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());
    		}
    		
    	}
    
    }
  • 相关阅读:
    使用匿名内部类和lamda的方式创建线程
    匿名内部类与lamda表达式
    机器学习中数据量多少与模型过拟合欠拟合之间的关系
    设计模式和java实现
    八大排序算法汇总——java实现
    java多线程并发编程中的锁
    java NIO
    网络通信引擎ICE的使用
    机器学习算法汇总大梳理
    处理样本不均衡数据
  • 原文地址:https://www.cnblogs.com/ddw1997/p/2338221.html
Copyright © 2011-2022 走看看