`
shappy1978
  • 浏览: 699884 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

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

    博客分类:
  • J2ME
阅读更多

先引用第一个讲述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();
	}

 

 

分享到:
评论

相关推荐

    kuix.rar 包括kuix以及kutil和demo

    标题中的"kuix.rar"是一个压缩文件,通常用于存储多个相关文件或文件夹,便于传输和存储。RAR是一种流行的压缩格式,由RarLab开发,它提供了更高的压缩比和更全面的错误修复功能。"kuix"、"kutil"和"demo"是这个...

    j2me开源框架Kuix源码

    总结来说,Kuix是一个针对J2ME平台的强大开源框架,它通过提供丰富的组件、事件处理机制、数据绑定等功能,降低了开发复杂度,提升了开发效率。配合详细的文档和示例,开发者可以更轻松地进入J2ME应用开发的世界。...

    KUIX详细的中文文档,翻译版本

    1. **兼容性广泛**:KUIX基于CLDC 1.0和MIDP 2.0标准,旨在支持广泛的设备,确保在多种Java ME平台上运行。 2. **高端应用开发**:KUIX包含了一系列组件,支持高级应用的开发,利用widget和继承概念,便于定制和...

    J2MEUI框架-Kuix

    目前广泛应用的J2Me框架,Kuix是一个使用XML/CSS来开发的lib,它提供了大部分UI组件,比 如:button,textfields,lists,menus,tabs等)。它的主页是源代码放在google code上,http://code.google.com/kuix,如果要使用...

    手机界面kuix-1.1.0

    1. **CHANGELOG**:这是一个变更日志文件,记录了 Kuix 从早期版本到 1.1.0 版本之间的更新和改进,包括新功能、bug修复以及性能优化等,对于开发者来说,它是了解库最新动态的重要参考。 2. **COPYING**:通常包含...

    kuix-1.1.0源代码

    首先,kuix-1.1.0是一个针对Java开发的库,其源代码提供了深入理解库功能和内部机制的机会。源代码通常包含了类、接口、方法以及其他相关资源,对于开发者来说,是学习和调试的关键资料。通过查看源代码,我们可以...

    kuix-1.1.0

    Kuix( Kalmeo User Interface eXtensions) http://www.kalmeo.org/projects/kuix: Kuix是一个使用XML/CSS来开发的lib,它提供了大部分UI组件,比 如:button,textfields,lists,menus,tabs等)。它的主页是源代码放在...

Global site tag (gtag.js) - Google Analytics