Kuix的事件处理机制(沙地版) 1

先引用第一个讲述Kuix事件机制的原文(虽然我引用的地址不一定是最初的原文)

http://niuwa.org/2008/09/03/kuix的事件处理机制/

    上面引用了原文的事件处理机制的原理图,要理解Kuix的事件处理机制,建议查看KuixCanvas原文,并参照此图。

    上面的文章是为数不多的Kuix中文讲解之一,我很早就浏览过了,当时只是粗略看了一下,由于没有太多兴趣研究其源代码,并没有作细致了解,之后在项目中碰到不少问题,都和Kuix的事件处理机制关联,这里结合发现的问题做一点讲解。

问题一 ScrollPane.bestScrollToChild 为何不生效

    在我的程序中有这样一个UI,从服务器接收到用户资料后,通过代码添加到列表(scrollPanel)中,以便用户可以选择列表中的项目,因为列表过长,所以添加完毕后滚动条会自动滚动到最后,我需要让滚动条自动滚动到页首。ScrollPane提供了bestScrollToChild,我的代码如下:

 

ScrollPane main=(ScrollPane)screen.getWidget("main");
main.bestScrollToChild(screen.getWidget("selUserName"), false);

 

     其中main是ScrollPane,selUserName是页首的一个控件,bestScrollToChild函数有两个参数,第一个是需要显示的widget,第二个是滚动间隔,为true是向要显示的widget滚动越滚动条1/4的高度,函数返回widget滚动后是否可见,为false时直接滚动到widget。单独执行上面的代码,确实可以让滚动条回到页首,但是在动态添加了列表后执行上面的代码,滚动条还是到页尾,debug发现,调用上述代码后确实调用ScrollPanel.setYOffset(私有函数)滚动到页首,但是随后又被doLayout函数调用setYOffset再次滚动到页尾,那么肯定是某种机制导致页面需要重新“布局”,无疑应该是上面添加列表导致的了,而且这个效果有一定的延迟,很可能是多线程导致的。实际上就是上图的worker线程,实际上worker是KuixCanvas的一个私有成员,KuixCanvas一开始看名字很像一个Kuix的Canvas基类,实际上是FrameWork的一个后台消息处理线程,在Kuix类中实例化,可以用Kuix.getCanvas()获得。在调用Widget.add添加控件时,发送了一个消息给处理线程,因为添加后容器的大小发生变化,需要重新布局,而doLayout后导致滚动条又一次移动到页尾。那么显然需要一个函数“提醒”消息处理线程处理完所有消息,再继续上面的代码,查看KuixCanvas的代码,发现它提供了revalidateAsSoonAsPossible函数:

 

	/**
	 * Revalidate (and repaint) the desktop as soon as possible. If the current
	 * thread is the worker thread the task is done immedialty else it is
	 * deferred to the next frame.
	 */
	public void revalidateAsSoonAsPossible() {
		if (!Worker.instance.isCurrentThread()) {
			revalidateNextFrame();
		} else {
			forceRevalidate();
			forceRepaint();
		}
	}

 

 revalidateNextFrame是弹出新的额窗口时才会调用的,所以应该是forceRevalidate

 

	/**
	 * Force desktop to be revalidated
	 */
	private void forceRevalidate() {
		needToRevalidate = false; // Tag as needToRevalidate = false first, because the revalidate process could cause invalidation
		desktop.revalidate();
		if (needToRevalidate) {
			forceRevalidate();
		}
	}

  /**

	 * Revalidate the Desktop
	 */
	public void revalidate() {
		doLayout();
	}

 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值