`

在Ext中如何使窗体总在最前面(how to set a window always on top in Ext)

 
阅读更多
如,有如下窗体
var formWin = new Ext.Window({
title: 'new window'
,width: 200
,height: 400
,html: 'This will be always on top'
});

现要使得这个窗体总是在其他窗体的前面,而且不影响其他窗体的使用(使用modal:true 选项可创建模态窗,但会冻结整个屏幕)。

国际惯例,先在官方论坛 搜索一下,最快捷、准确的方法是使用google来搜索。果然google没让人失望,第一页里就找到了关键帖

他介绍的方法是修改Ext.WindowGroup 类(位于 widgets/WindowManager.js )的私有方法sortWindows(),改为:

var sortWindows = function(d1, d2){
return (!d1.alwaysOnTop && (d2.alwaysOnTop || !d1._lastAccess || d1._lastAccess < d2._lastAccess)) ? -1 : 1;
};

这样就运行在初始化window时可以使用一个新的选项:alwaysOnTop ,如:
var formWin = new Ext.Window({
title: 'new window'
,width: 200
,height: 400
,html: 'This will be always on top'
,alwaysOnTop: true
});

修改做的修改很少,但要hack源码肯定是最差的备选的方案。

而sortWindows 是个私有方法,js是无法从类外覆盖私有方法的,具体可参考
Tutorial:Application Layout for Beginners

因此尝试剑走偏锋,看看有没其他方案。查看Ext.Window的API ,在事件中的部分发现有两个事件是相关的:

activate : ( Ext.Window this )
Fires after the window has been visually activated via setActive.

deactivate : ( Ext.Window this )
Fires after the window has been visually deactivated via setActive.

一般来说,要使窗体总在最前方,应该是先触发了deactivate事件,因此在这时再主动设置为active,则可使窗体总保持激活状态也即是最前方了。

尝试如下:
formWin.on('deactivate', function(){
this.setActive(true);
})

发现无效。阅读setActive的源码后知道原来setActive 只是用来设置是否显示窗体阴影是否显示。
Ext.Window 还有一个公共方法可以利用:
toFront() : Ext.Window
Brings this window to the front of any other visible windows

尝试用来代替setActive:
formWin.on('deactivate', function(){
this.toFront();
})

发现也无效,查看源码发现Ext.Window.toFront() 实际是调用 Ext.WindowGroup.bringToFront(win),而在 Ext.WindowGroup.bringToFront(win) 里会判断 win 是否是当前窗口,如果是就不做任何操作,而在deactivate 里,当前窗口正是formWin,所以不会对他做任何操作。

在仔细跟读源码,原来决定窗体哪个在前面,是使用Ext.Window.setZIndex() 在设置窗体z轴(垂直于电脑屏幕的轴)的zIndex值,越高的则越前。

知道底层实现原理就好办了,只要给formWin设置一个较大的zIndex值则可,尝试如:

formWin.on('deactivate', function(){
this.setZIndex(9999);
})

点击其他窗体,formWin总是显示在最前方了。

但窗体的数量是不确定的,而Ext用来调整各个窗体的前后顺序是动态的,具体实现源码为:
// private
var orderWindows = function(){
var a = accessList, len = a.length;
if(len > 0){
a.sort(sortWindows);
var seed = a[0].manager.zseed;
for(var i = 0; i < len; i++){
var win = a[i];
if(win && !win.hidden){
win.setZIndex(seed + (i*10));
}
}
}
activateLast();
};

因此,也要根据当前窗体的数量来动态调整zIndex的值,代码改为:
formWin.on('deactivate', function(){
var i=1;
this.manager.each(function(){i++});
this.setZIndex(this.manager.zseed + (i*10));
})

至此,可以说是已经完整实现了需求。

但有时窗体是直接new出来,没有赋值给临时变量,需要能在构造函数中设置。幸好Ext的接口丰富,有提供一个plugin的选项来提供扩展(如何写一个Ext的plugin: Plugins: Writing a Plugin),最终实现代码为:

var formWin = new Ext.Window({
title: 'new window'
,width: 200
,height: 400
,html: 'This will be alwasy on top'
,plugins: new function(){
this.init = function(win){
win.on('deactivate', function(){
var i=1;
this.manager.each(function(){i++});
this.setZIndex(this.manager.zseed + (i*10));
})
}
}
});


如果要实现重用,最好把plugin实现代码抽取为一个独立的plugin,如:
Ext.ux.WindowAlwaysOnTop = function(){
this.init = function(win){
win.on('deactivate', function(){
var i=1;
this.manager.each(function(){i++});
this.setZIndex(this.manager.zseed + (i*10));
})
}
}

以后使用则很方便了:
var formWin = new Ext.Window({
title: 'new window'
,width: 200
,height: 400
,html: 'This will be always on top'
,plugin: new Ext.ux.WindowAlwaysOnTop
});

效果如图
new window active:
new window deactive:
分享到:
评论

相关推荐

    一个简单的Ext.Window中插入图片的例子

    此外,提供的`一个简单的Ext.Window中插入图片.doc`文件可能包含更详细的步骤或示例代码,建议查阅该文档以获取更深入的理解。记住,实践是最好的老师,动手尝试并根据项目需求进行调整,你将更加熟练地掌握在`Ext....

    Windows读写Ext2/Ext3/Ext4文件系统

    可以读写Ext2,以Ext2方式挂载Ext3文件系统(不支持Ext3日志),不支持中文! It provides Windows NT4.0/2000/XP/2003/Vista/2008 with full access to Linux Ext2 volumes (read access andwrite access). This ...

    ext仿windows操作系统窗体嵌入桌面问题

    标题中的“ext仿windows操作系统窗体嵌入桌面问题”指的是使用EXTJS框架开发的应用程序,尝试模拟Windows操作系统的界面风格,将窗口(窗体)嵌入到桌面环境中。EXTJS是一个基于JavaScript的富客户端框架,它允许...

    Windows读写Ext2/Ext3/Ext4文件系统4

    支持Ext2/Ext3/Ext4, HFS 和 ReiserFS,只读。 There are a number of evident merits of the program, which you should know. First of all,DiskInternals Linux Reader is absolutely free. Secondly, the ...

    Ext window的使用

    在IT行业中,Ext JS是一个广泛使用的JavaScript库,用于构建富客户端Web应用程序。它提供了一套完整的组件模型,其中包括“窗口”(Window)组件,这是创建弹出式对话框或浮动面板的重要工具。本文将深入探讨Ext ...

    Ext-window属性

    在Ext JS中,`Ext.Panel`是一个强大的组件,它可以用来创建各种复杂的用户界面。当Panel被用作窗口时,它通常会继承或包含`Ext.window.Window`的一些属性。以下是对`Ext.Panel` API中与`Window`相关的属性的详细解释...

    Ext.window从右下角弹出/隐藏

    本文将详细探讨如何在ExtJS中实现一个窗口(`Ext.window`)从右下角动态弹出并隐藏的功能,类似于即时通讯软件(如MSN)中的登录提醒。 #### 二、关键技术点 ##### 1. **自定义窗口类** 为了实现上述需求,首先...

    Ext_Window用法

    Ext_Window用法

    ext 仿window 界面

    EXTJS 是一个强大的JavaScript 库,它主要用于构建富客户端应用程序,尤其在企业级Web应用中广泛应用。"ext 仿window 界面"指的是使用EXTJS 框架来创建类似于Windows桌面操作系统的用户界面,提供一种熟悉且直观的...

    bcprov-ext-jdk15on-152和bcprov-jdk15on-152

    标题中的"bcprov-ext-jdk15on-152"和"bcprov-jdk15on-152"是两个与Bouncy Castle库相关的Java档案文件,它们主要用于提供加密和安全服务。Bouncy Castle是一个开源的Java安全提供者,广泛用于密码学应用,包括加密、...

    ext教程、ext核心API 、ext中文教程

    在"EXT教程"中,你将学习到EXT的基础知识,包括如何初始化应用、创建组件、布局管理以及如何与其他JavaScript库或后端服务集成。EXT的组件化思想是其核心,通过各种组件如表格(Grid)、面板(Panel)、窗口(Window...

    Ext JS in Action, 2nd Edition

    Along the way, you’ll learn the best practices for building and scaling full-featured web applications, including how to customize and build Ext widgets. Fully revised for Ext JS 4.0. About this ...

    bcprov-ext-jdk15on-1.54.jar和bcprov-jdk15on-1.54.jar压缩文件

    总的来说,bcprov-jdk15on和bcprov-ext-jdk15on为Java开发者提供了强大的加密工具箱,使得在Java平台上实现安全功能变得更加简单。正确理解和使用这两个库,将有助于提升项目的安全性,保护用户的隐私信息,同时降低...

    Ext JS in Action (第1版,深入研究Ext JS 3.0)

    Ext JS in Action is a comprehensive guide to Ext JS. By following its rich examples, patterns, and best practices, you'll achieve the kinds of results you only see in top JavaScript applications. This...

    bcprov-jdk15on-1.54.jar bcprov-ext-jdk15on-1.54.jar下载

    1.bcprov-ext-jdk15on-1.54.jar 2.bcprov-jdk15on-1.54.jar 下载地址在:http://download.csdn.net/detail/cw_hello1/9557049 2.将下载的两个JAR文件复制到:JDK安装目录\jre\lib\ext下,例如我的就是D:\Program ...

    bcprov-ext-jdk15on-1.52和bcprov-jdk15on-1.52

    标题中的"bcprov-ext-jdk15on-1.52"和"bcprov-jdk15on-1.52"是两个不同版本的Java软件包,它们都是由The Legion of the Bouncy Castle(Bouncy Castle)组织提供的加密库。Bouncy Castle是一个广泛使用的开源Java...

    bcprov-ext-jdk15on-1.54.jar,bcprov-jdk15on-1.54.jar

    在Java开发过程中,有时会遇到一个异常:“java.lang.RuntimeException: Could not generate DH keypair”。这个异常通常是由于Java加密库的问题导致的,特别是在进行安全通信,如使用SSL/TLS协议时,系统尝试生成...

    EXT4 源码+window下模拟ext2+linux_ext文件系统模拟

    EXT4是Linux操作系统中最常用的文件系统之一,它在2008年被引入到Linux内核,以替代较旧的EXT3系统。EXT4的主要改进包括更大的文件系统大小支持、更快的性能以及对大量小文件的优化处理。在这个压缩包中,你可能会...

    EXT JS中文API+中文教程+中文资料+源码

    EXT JS是一种基于JavaScript的开源富客户端框架,专为构建交互式Web应用程序而设计。它提供了大量的组件和功能,包括表格、树形视图、图表、菜单、工具栏、窗体等,使得开发者能够构建功能丰富的桌面级应用界面。EXT...

Global site tag (gtag.js) - Google Analytics