`
sun4love
  • 浏览: 226868 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

拖拽组件事例

阅读更多

1,页面元素

 

 

<window id="dropDemoWin" apply="controller.DropDemoController">
 <listbox>
   <listitem id="draged1111111111" draggable="true" droppable="true" onDrop="dropDemoWin$composer.onDropListitem(event)">
 </listbox>
</window>

 如果不知道dropDemoWin$composer怎么来的看这里【zk开发】如何在页面中获得composer对象

 

 

2,将拖放的组件添加进来 onDropListitem

 

 

public class DropDemoController extends GenericAutowireComposer {

     public void onDropListitem(DropEvent event) {
		if (!(event.getDragged() instanceof Listitem)) {
			// ZkUtils.showError("some errors");
			return;
		}
		// event.getDragged()获得你托动过来的组件
		Listitem draggedListitem = (Listitem) event.getDragged();
		// event.getTarget()是你释放鼠标,鼠标下的那个组件,即draggedListitem将要放在那个组件上,或下
		Listitem targetListitem = (Listitem) event.getTarget();
//		//放在目标组件之前
//		targetListitem.getParent()
//				.insertBefore(draggedListitem, targetListitem);
		//当然你也可以放在目标组件之后
		//
		Component afterComp=targetListitem.getNextSibling();
		//后一个组件是托过来的组件,什么都不做
		if(afterComp ==draggedListitem){
			return;
		}
		if(afterComp==null){//如果没有下一个组件说明target是最后一个,直接添加到listbox里
			draggedListitem.detach();
			draggedListitem.setParent(targetListitem.getParent());
		}else{//注意这里的insertBefore的第二个参数
			targetListitem.getParent().insertBefore(draggedListitem, afterComp);
		}
		
	}

}
分享到:
评论
5 楼 sun4love 2011-03-08  
pen_xian 写道
sun4love 写道
pen_xian 写道
刚刚看到的23句,
draggedListitem.detach(); 
draggedListitem.setParent(targetListitem.getParent()); 
组件被销毁了 还能setParent  为什么



draggedListitem.detach(); 

其实内部调用的是setParent(null);

即设置该组件不属于任何组件,也就不属于任何页面,因此无法显示

相当于hibernate里的游离对象

设置null以后并不是说draggedListitem就消失了,只能说明它不合任何对象关联

知识等待gc回收,但你重新设置它的父组件,那么它有可以显示了,
就像hibernate里的游离对象重新update,或load的时候,它有受session管理一样


为何不直接draggedListitem.setParent(targetListitem.getParent());
还要draggedListitem.detach(); 不是多此一举吗?



因为draggedListitem已经是listbox的子组件了,重复添加子组件,报错,必须先分离父子关系,再重加
4 楼 pen_xian 2011-03-08  
sun4love 写道
pen_xian 写道
刚刚看到的23句,
draggedListitem.detach(); 
draggedListitem.setParent(targetListitem.getParent()); 
组件被销毁了 还能setParent  为什么



draggedListitem.detach(); 

其实内部调用的是setParent(null);

即设置该组件不属于任何组件,也就不属于任何页面,因此无法显示

相当于hibernate里的游离对象

设置null以后并不是说draggedListitem就消失了,只能说明它不合任何对象关联

知识等待gc回收,但你重新设置它的父组件,那么它有可以显示了,
就像hibernate里的游离对象重新update,或load的时候,它有受session管理一样


为何不直接draggedListitem.setParent(targetListitem.getParent());
还要draggedListitem.detach(); 不是多此一举吗?
3 楼 sun4love 2011-03-08  
pen_xian 写道
刚刚看到的23句,
draggedListitem.detach(); 
draggedListitem.setParent(targetListitem.getParent()); 
组件被销毁了 还能setParent  为什么



draggedListitem.detach(); 

其实内部调用的是setParent(null);

即设置该组件不属于任何组件,也就不属于任何页面,因此无法显示

相当于hibernate里的游离对象

设置null以后并不是说draggedListitem就消失了,只能说明它不合任何对象关联

知识等待gc回收,但你重新设置它的父组件,那么它有可以显示了,
就像hibernate里的游离对象重新update,或load的时候,它有受session管理一样

2 楼 pen_xian 2011-03-08  
刚刚看到的23句,
draggedListitem.detach(); 
draggedListitem.setParent(targetListitem.getParent()); 
组件被销毁了 还能setParent  为什么
1 楼 pen_xian 2011-03-08  
每次看你的博客都有些收获!

相关推荐

Global site tag (gtag.js) - Google Analytics