<!--StartFragment -->
下面这个实例是将相应的物品拖放指定面板中,本例用到了MVC模式
物品为分为上衣和裤子,有三个面板Panel,一个容纳上衣的面板,一个容纳裤子的面板,还有一个是货架可以容纳上衣和裤子。
即:
1)货架中的上衣可以拖放到上衣面板中,反之上衣面板中的物品可以拖放到货架中;
2)货架中的裤子可以拖放到裤子面板中,反之裤子面板中的物品可以拖放到货架中;
3)上衣不能拖放到裤子面板中,裤子不能拖放到上衣面板中;
效果图请看附近中view.jpg
第一步:创建物品VO,
ItemVO.java
package mytest.dragDrop.item
{
public class ItemVO
{
private var _id:int;
private var _name:String;
private var _type:int;
public function ItemVO($id:int, $name:String, $type:int)
{
this._id = $id;
this._name = $name;
this._type = $type;
}
public function get type():int
{
return _type;
}
public function set type(value:int):void
{
_type = value;
}
public function get name():String
{
return _name;
}
public function set name(value:String):void
{
_name = value;
}
public function get id():int
{
return _id;
}
public function set id(value:int):void
{
_id = value;
}
}
}
第二步:创建物品组件,因为物品要以组件Label的形式放在Panel中(可以根据自己的要求来包装物品VO)
ItemLabel.as
package mytest.dragDrop.item
{
import org.aswing.JLabel;
import org.aswing.dnd.DragManager;
import org.aswing.dnd.SourceData;
import org.aswing.event.DragAndDropEvent;
public class ItemLabel extends JLabel
{
private var _item:ItemVO;
public function ItemLabel($item:ItemVO)
{
super($item.name);
this._item = $item;
setDragEnabled(true);
addEventListener(DragAndDropEvent.DRAG_RECOGNIZED, __onDragStart);
}
private function __onDragStart(event:DragAndDropEvent):void{
DragManager.startDrag(this, new SourceData("item", _item));
}
public function getItem():ItemVO{
return this._item;
}
}
}
第三步:Model类
ItemModel.as
package mytest.dragDrop.item
{
import flash.events.Event;
import flash.events.EventDispatcher;
import org.aswing.util.HashMap;
public class ItemModel extends EventDispatcher
{
public static const EVENT_GET_ITEM_SUCC:String = "event_get_item_succ";
private var _itemMap:HashMap;
public function ItemModel()
{
_itemMap = new HashMap();
}
public function getItemByType($type:int):void{
if($type == 1001){
_itemMap.put(1001, [
new ItemLabel(new ItemVO(8002, "上衣2", 1001)),
new ItemLabel(new ItemVO(8003, "上衣3", 1001))
]);
}
else if($type == 1002){
_itemMap.put(1002, [
new ItemLabel(new ItemVO(9001, "裤子1", 1002)),
]);
}
else{
_itemMap.put(-1, [
new ItemLabel(new ItemVO(8001, "上衣1", 1001)),
new ItemLabel(new ItemVO(9002, "裤子2", 1002)),
new ItemLabel(new ItemVO(9003, "裤子3", 1002))
]);
}
dispatchEvent(new Event(EVENT_GET_ITEM_SUCC));
}
public function get itemMap():HashMap
{
return _itemMap;
}
public function set itemMap(value:HashMap):void
{
_itemMap = value;
}
}
}
第四步:Control类
ItemControl.as
package mytest.dragDrop.item
{
public class ItemControl
{
private var _itemModel:ItemModel;
public function ItemControl($itemModel:ItemModel)
{
this._itemModel = $itemModel;
}
public function getItemByType($type:int):void{
_itemModel.getItemByType($type);
}
}
}
第五步:物品面板,前面的ItemLabel是会放在ItemPanel中的
ItemPanel.as
package mytest.dragDrop.item
{
import flash.events.Event;
import org.aswing.ASColor;
import org.aswing.JPanel;
import org.aswing.border.TitledBorder;
import org.aswing.event.DragAndDropEvent;
public class ItemPanel extends JPanel
{
private var _itemModel:ItemModel;
private var _itemControl:ItemControl;
private var _type:int;
private var _originalBG:ASColor;
public function ItemPanel($itemModel:ItemModel, $itemControl:ItemControl, $title:String, $type:int = -1)
{
super();
this._itemModel = $itemModel;
this._itemControl = $itemControl;
this._type = $type;
var border:TitledBorder = new TitledBorder(null, $title);
border.setColor(ASColor.BLACK);
setBorder(border);
setDropTrigger(true);
setDragAcceptableInitiatorAppraiser(__onDragAppraiser);
addEventListener(DragAndDropEvent.DRAG_ENTER, __onDragEnter);
addEventListener(DragAndDropEvent.DRAG_EXIT, __onDragExit);
addEventListener(DragAndDropEvent.DRAG_DROP, __onDragDrop);
setOpaque(true);
_originalBG = getBackground();
_itemModel.addEventListener(ItemModel.EVENT_GET_ITEM_SUCC, __onGetItemSucc);
_itemControl.getItemByType($type);
}
private function __onGetItemSucc(event:Event):void{
appendItemLabel(_itemModel.itemMap.get(this._type) as Array);
}
private function appendItemLabel(items:Array):void{
for each(var item:ItemLabel in items){
this.append(item);
}
_itemModel.removeEventListener(ItemModel.EVENT_GET_ITEM_SUCC, __onGetItemSucc);
}
private function __onDragAppraiser(initiator:ItemLabel):Boolean{
if(_type == -1)
return true;
else
return _type == initiator.getItem().type;
}
private function __onDragEnter(event:DragAndDropEvent):void{
var initiator:ItemLabel = event.getDragInitiator() as ItemLabel;
if(__onDragAppraiser(initiator)){
setBackground(ASColor.GREEN);
}
}
private function __onDragExit(event:DragAndDropEvent):void{
setBackground(_originalBG);
var initiator:ItemLabel = event.getDragInitiator() as ItemLabel;
if(__onDragAppraiser(initiator)){
}
}
private function __onDragDrop(event:DragAndDropEvent):void{
setBackground(_originalBG);
var initiator:ItemLabel = event.getDragInitiator() as ItemLabel;
if(__onDragAppraiser(initiator)){
append(initiator);
}
}
public function getItems():Array{
return this.children;
}
}
}
第六步:主界面
ItemDragDrop.as
package mytest.dragDrop.item
{
import flash.display.Sprite;
import flash.events.MouseEvent;
import org.aswing.AsWingManager;
import org.aswing.GridLayout;
import org.aswing.JButton;
import org.aswing.JFrame;
import org.aswing.JPanel;
import org.aswing.geom.IntDimension;
public class ItemDragDrop extends Sprite
{
private var _frm:JFrame;
private var _jacketArea:ItemPanel;
private var _pantsArea:ItemPanel;
private var _whiteArea:ItemPanel;
private var _itemModel:ItemModel;
private var _itemControl:ItemControl;
public function ItemDragDrop()
{
AsWingManager.initAsStandard(this);
_itemModel = new ItemModel();
_itemControl = new ItemControl(_itemModel);
_frm = new JFrame(null, "物品分配");
_jacketArea = new ItemPanel(_itemModel, _itemControl, "上衣", 1001);
_pantsArea = new ItemPanel(_itemModel, _itemControl, "裤子", 1002);
_whiteArea = new ItemPanel(_itemModel, _itemControl, "货架", -1);
var panel:JPanel = new JPanel(new GridLayout(2, 2, 4, 4));
panel.appendAll(_jacketArea, _pantsArea, _whiteArea);
var showBtn:JButton = new JButton("查看");
showBtn.addEventListener(MouseEvent.CLICK, __onClick);
panel.appendAll(showBtn);
_frm.setContentPane(panel);
_frm.setSize(new IntDimension(400, 400));
_frm.show();
}
private function __onClick(e:MouseEvent):void{
trace("===上衣===");
for each (var jacket:ItemLabel in _jacketArea.getItems()){
trace(jacket.getItem().name);
}
trace();
trace("===裤子===");
for each (var pants:ItemLabel in _pantsArea.getItems()){
trace(pants.getItem().name);
}
trace();
trace("===货架===");
for each (var white:ItemLabel in _whiteArea.getItems()){
trace(white.getItem().name);
}
trace();
}
}
}