面板以及窗口的使用

面板Panel

面板Panel 是ExtJS 控件的基础,很高级控件都是在面板的基础上扩展的,还有其它大多数控件也都直接或间接有关系。应用程序的界面一般情况下是由一个一个的面板通过不同组织方式形成。

面板由以下几个部分组成,一个顶部工具栏、一个底部工具栏、面板头部、面板尾部、面板主区域几个部分组件。面板类中还内置了面板展开、关闭等功能,并提供一系列可重用的工具按钮使得我们可以轻松实现自定义的行为,面板可以放入其它任何容器中,面板本身是一个容器,它里面又可以包含各种其它组件。

Ext.onReady(function(){

new Ext.Panel({

renderTo:"hello",

title:"面板头部header",

width:300,

height:200,

html:'<h1>面板主区域</h1>',

tbar:[{text:'顶部工具栏topToolbar'}],

bbar:[{text:'底部工具栏bottomToolbar'}],

buttons:[{text:"按钮位于footer"}]

});

});

运行该代码,可以得到如图所示的输出结果,清楚的表示出了面板的各个组成部分。

  

一般情况下,顶部工具栏或底部工具栏只需要一个,而面板中一般也很少直接包含按钮,一般会把面板上的按钮直接放到工具栏上面。比如下面的代码:

Ext.onReady(function(){

new Ext.Panel({

renderTo:"hello",

title:"hello",

width:300,

height:200,

html:'<h1>Hello,easyjf open source!</h1>',

tbar:[{pressed:true,text:'刷新'}]

});

});

可以得到如图所示的效果,该面板包含面板Header,一个顶部工具栏及面板区域三个部分。

  


面板中可以有工具栏,工具栏可以位于面板顶部或底部,Ext 中工具栏是由Ext.Toolbar类表示。工具栏上可以存放按钮、文本、分隔符等内容。面板对象中内置了很多实用的工具栏,可以直接通过面板的tools 配置选项往面板头部加入预定义的工具栏选项。比如下面的代码:

Ext.onReady(function(){

new Ext.Panel({

renderTo:"hello",

title:"hello",

width:300,

height:200,

html:'<h1>Hello,easyjf open source!</h1>',

tools:[{id:"save"},

{id:"help", handler:function(){Ext.Msg.alert('help','please help me!');}

},{id:"close"}],

tbar:[{pressed:true,text:'刷新'}]

});

})

  

点击help按钮会执行handler中的函数,显示一个弹出对话框,而点击其它的按钮不会有任何行为产生,因为没有定义他们的handler

除了在面板头部加入这些已经定义好的工具栏选择按钮以外,还可以在顶部或底工具栏中加入各种工具栏选项。这些工具栏选项主要包括按钮、文本、空白、填充条、分隔符等。

代码:

Ext.onReady(function(){

new Ext.Panel({

renderTo:"hello",

title:"hello",

width:300,

height:200,

html:'<h1>Hello,easyjf open source!</h1>',

tbar:[new Ext.Toolbar.TextItem('工具栏:'),

{xtype:"tbfill"},

{pressed:true,text:'添加'},

{xtype:"tbseparator"},

{pressed:true,text:'保存'}

]

});

});

  

Ext中的工具栏项目主要包含下面的类:

Ext.Toolbar.Button-按钮,xtype为tbbutton

TextItem-

Ext.Toolbar.Fill-

Separator-

Spacer-

SplitButton-


为了显示一个面板,我们需要在页面上添加一个,然后把Ext 控件渲染到这个div 上。VeiwPort 代表整个浏览器显示区域,该对象渲染到页面的body 区域,并会随着浏览器显示区域的大小自动改变,一个页面中只能有一个ViewPort 实例。看下面的代码:

Ext.onReady(function(){

new Ext.Viewport({

enableTabScroll:true,

layout:"fit",

items:[{title:"面板",

html:"",

bbar:[{text:"按钮1"},

{text:"按钮2"}]

}]

});

});

 

Viewport 不需要再指定renderTo,而我们也看到Viewport 确实填充了整个浏览器显示区域,并会随着浏览器显示区域大小的改变而改变。

Viewport 主要用于应用程序的主界面,可以通过使用不同的布局来搭建出不同风格的应用程序主界面。在Viewport 上常用的布局有fitborder 等,当然在需要的时候其它布局也会常用。看下面的代码:

Ext.onReady(function(){

new Ext.Viewport({

enableTabScroll:true,

layout:"border",

items:[{title:"面板",

region:"north",

height:50,

html:"<h1>网站后台管理系统!</h1>"

},

{title:"菜单",

region:"west",

width:200,

collapsible:true,

html:"菜单栏"

},

{

xtype:"tabpanel",

region:"center", items:[{title:"面板1"},

{title:"面板2"}]

}

]

});

});

 

窗口Ext.Window

ExtJS 中窗口是由Ext.Window 类定义,该类继承自Panel,因此窗口其实是一种特殊的面板Panel。窗口包含了浮动、可拖动、可关闭、最大化、最小化等特性。看下面的代码:

var i=0;

function newWin()

{

var win=new Ext.Window({title:"窗口"+i++,

width:400,

height:300,

maximizable:true});

win.show();

}

Ext.onReady(function(){

Ext.get("btn").on("click",newWin);

});

页面中的html 内容:

<input id="btn" type="button" name="add" value="新窗口" />

执行上面的代码,当点击按钮新窗口的时候,会在页面中显示一个窗口,窗口标题为窗口x”,窗口可以关闭,可以最大化,点击最大化按钮会最大化窗口,最大化的窗口可以还原


窗口是分组进行管理的,可以对一组窗口进行操作,默认情况下的窗口都在默认的组Ext.WindowMgr 中。窗口分组由类Ext.WindowGroup 定义,该类包括bringToFront、getActive、hideAll、sendToBack 等方法用来对分组中的窗口进行操作。

var i=0,mygroup;

function newWin()

{

var win=new Ext.Window({title:"窗口"+i++,

width:400,

height:300,

maximizable:true,

manager:mygroup});

win.show();

}

function toBack()

{

mygroup.sendToBack(mygroup.getActive());

}function hideAll()

{

mygroup.hideAll();

}

Ext.oReay(function(){

mygroup=new Ext.WindowGroup();

Ext.get("btn").on("click",newWin);

Ext.get("btnToBack").on("click",toBack);

Ext.get("btnHide").on("click",hideAll);

});

页面中的html 代码

<input id="btn" type="button" name="add" value="新窗口" />

<input id="btnToBack" type="button" name="add" value="放到后台" />

<input id="btnHide" type="button" name="add" value="隐藏所有" />

执行上面的代码,先点击几次”新窗口”按钮,可以在页面中显示几个容器,然后拖动这些窗口,让他们在屏幕中不同的位置。然后点”放到后台”按钮,可以实现把最前面的窗口移动该组窗口的最后面去,点击”隐藏所有”按钮,可以隐藏当前打开的所有窗口。


 

由于传统使用alertconfirm 等方法产生的对话框非常古板,不好看。因此,ExtJS 提供了一套非常漂亮的对话框,可以使用这些对话框代替传统的alertconfirm 等,实现华丽的应用程序界面。

Ext 的对话框都封装在Ext.MessageBox 类,该类还有一个简写形式即Ext.Msg,可以直接通过Ext.MessageBox 或Ext.Msg 来直接调用相应的对话框方法来显示Ext 对话框。看下面的代码:

Ext.onReady(function(){

Ext.get("btnAlert").on("click",function(){

Ext.MessageBox.alert("请注意","这是ExtJS的提示框");

});

});

Html 页面中的内容:

<input id="btnAlert" type="button" value="alert框" />


除了alert 以外,Ext 还包含confirmpromptprogresswait 等对话框,另外我们可以根据需要显示自下定义的对话框。普通对话框一般包括四个参数,比如confirm 的方法签名为confirm ( String title, String msg, [Function fn], [Object scope] ) ,参数title 表示对话框的标题,参数msg 表示对话框中的提示信息,这两个参数是必须的;可选的参数fn 表示当关闭对话框后执行的回调函数,参数scope 表示回调函数的执行作用域。回调函数可以包含两个参数,即button 与text,button 表示点击的按钮,text 表示对话框中有活动输入选项时输入的文本内容。我们可以在回调函数中通过button 参数来判断用户作了什么什么选择,可以通过text 来读取在对话框中输入的内容。看下面的例子:

Ext.onReady(function(){

Ext.get("btn").on("click",function(){

Ext.MessageBox.confirm("请确认","是否真的要删除指定的内容",function(button,text){

alert(button);

alert(text);

});

});

});


因此,在实际的应用中,上面的代码可以改成如下的内容:

Ext.onReady(function(){

Ext.get("btnAlert").on("click",function(){

Ext.MessageBox.confirm("请确认","是否真的要删除指定的内容",function(button,text){

if(button=="yes"){

//执行删除操作

alert("成功删除");

}

});

});

});

这样当用户点击对话框中的yes 按钮时,就会执行相应的操作,而选择no 则忽略操作。

下面再看看prompt ,我们看下面的代码:

Ext.onReady(function(){

Ext.get("btn").on("click",function(){

Ext.MessageBox.prompt("输入提示框","请输入你的新年愿望:",function(button,text){

if(button=="ok"){

alert("你的新年愿望是:"+text);

}

else alert("你放弃了录入!");

});

});

})

Html 页面:

<input id="btn" type="button" value="对话框" />


在实际应用中,可以直接使用MessageBox 的show 方法来显示自定义的对话框,如下

面的代码:

function save(button)

{

if(button=="yes")

{

//执行数据保存操作

} else if(button=="no")

{

//不保存数据

} else

{

//取消当前操作

}

}

Ext.onReady(function(){

Ext.get("btn").on("click",function(){

Ext.Msg.show({

title:'保存数据',

msg: '你已经作了一些数据操作,是否要保存当前内容的修改?',

buttons: Ext.Msg.YESNOCANCEL,

fn: save,

icon: Ext.MessageBox.QUESTION});

});

})

点击”对话框”按钮可显示一个自定义的保存数据对话框,对话框中包含yes、no、cancel

三个按钮,可以在回调函数save 中根据点击的按钮执行相应的操作

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,456评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,370评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,337评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,583评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,596评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,572评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,936评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,595评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,850评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,601评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,685评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,371评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,951评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,934评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,167评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,636评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,411评论 2 342

推荐阅读更多精彩内容