`
nihongye
  • 浏览: 102045 次
  • 性别: Icon_minigender_1
  • 来自: 深圳
社区版块
存档分类
最新评论

EXT2的动态BorderLayout组件

阅读更多
因为问答频道询问这个问题,自己也遇到过,以前是用动态改变south大小来实现的,尝试直接实现一个动态的BorderLayout,发现很简单,下面代码改写自BorderLayout的代码,实现BorderLayout区域的动态增减:
布局控制器的代码:
Ext.layout.DynamicBorderLayout = Ext.extend(Ext.layout.BorderLayout, {
	onLayout : function(ct, target) {
		var collapsed = [];
		target.position();
		if (!this.rendered) {
			target.addClass('x-border-layout-ct');
			this.rendered = true;
		}
                //这部分代码直接从上面this.rendered的条件移出来,增加typeof this[pos] == "undefined"的判断
		var items = ct.items.items;
		for (var i = 0, len = items.length; i < len; i++) {
			var c = items[i];
			var pos = c.region;
			if (typeof this[pos] == "undefined")
			{
				if (c.collapsed) {
					collapsed.push(c);
				}
				c.collapsed = false;
				if (!c.rendered) {
					c.cls = c.cls ? c.cls + ' x-border-panel' : 'x-border-panel';
					c.render(target, i);
				}
				this[pos] = pos != 'center' && c.split ?
							new Ext.layout.BorderLayout.SplitRegion(this, c.initialConfig, pos) :
							new Ext.layout.BorderLayout.Region(this, c.initialConfig, pos);
				this[pos].render(target, c);
			}
		}
                //删除掉不需要的区域属性 
		this.removeNotExistsRegion(ct.items);
		var size = target.getViewSize();
		if (size.width < 20 || size.height < 20) { // display none?
			if (collapsed) {
				this.restoreCollapsed = collapsed;
			}
			return;
		} else if (this.restoreCollapsed) {
			collapsed = this.restoreCollapsed;
			delete this.restoreCollapsed;
		}

		var w = size.width, h = size.height;
		var centerW = w, centerH = h, centerY = 0, centerX = 0;

		var n = this.north, s = this.south, west = this.west, e = this.east, c = this.center;
		if (!c) {
			throw 'No center region defined in BorderLayout ' + ct.id;
		}

		if (n && n.isVisible()) {
			var b = n.getSize();
			var m = n.getMargins();
			b.width = w - (m.left + m.right);
			b.x = m.left;
			b.y = m.top;
			centerY = b.height + b.y + m.bottom;
			centerH -= centerY;
			n.applyLayout(b);
		}
		if (s && s.isVisible()) {
			var b = s.getSize();
			var m = s.getMargins();
			b.width = w - (m.left + m.right);
			b.x = m.left;
			var totalHeight = (b.height + m.top + m.bottom);
			b.y = h - totalHeight + m.top;
			centerH -= totalHeight;
			s.applyLayout(b);
		}
		if (west && west.isVisible()) {
			var b = west.getSize();
			var m = west.getMargins();
			b.height = centerH - (m.top + m.bottom);
			b.x = m.left;
			b.y = centerY + m.top;
			var totalWidth = (b.width + m.left + m.right);
			centerX += totalWidth;
			centerW -= totalWidth;
			west.applyLayout(b);
		}
		if (e && e.isVisible()) {
			var b = e.getSize();
			var m = e.getMargins();
			b.height = centerH - (m.top + m.bottom);
			var totalWidth = (b.width + m.left + m.right);
			b.x = w - totalWidth + m.left;
			b.y = centerY + m.top;
			centerW -= totalWidth;
			e.applyLayout(b);
		}

		var m = c.getMargins();
		var centerBox = {
			x: centerX + m.left,
			y: centerY + m.top,
			width: centerW - (m.left + m.right),
			height: centerH - (m.top + m.bottom)
		};
		c.applyLayout(centerBox);

		if (collapsed) {
			for (var i = 0, len = collapsed.length; i < len; i++) {
				collapsed[i].collapse(false);
			}
		}

		if (Ext.isIE && Ext.isStrict) { // workaround IE strict repainting issue
			target.repaint();
		}
	},
	removeNotExistsRegion:function(items) {
		var regions = ["north","south","west"];
		for (var i = 0; i < regions.length; i++)
		{
			if (this[regions[i]] && !items.find(function(item) {
				return item.region == regions[i]
			}))
			{
				this[regions[i]] = undefined;
			}
		}
	}
})
Ext.Container.LAYOUTS['dynamicborder'] = Ext.layout.DynamicBorderLayout;


可运行的例子:
Ext.onReady(function() {
	var view = new Ext.Viewport({
		layout:"fit",
		items:{
			layout:"dynamicborder",
			items:[{
				title: 'Main Content',
				region:'center',
				margins: '5 5 0 0',
				tbar:[{
					text:"增加南",
					handler:function() {
						var container = view.items.items[0];
						var region = container.find("region", "south")[0];
						if (region)
						{
							return;
						}
						container.add({
							title: 'South Panel',
							region: 'south',
							height: 100,
							minSize: 75,
							maxSize: 250,
							margins: '0 5 5 5'
						});
						container.doLayout();
					}
				},{
					text:"去除南",
					handler:function() {
						var container = view.items.items[0];
						var region = container.find("region", "south")[0];
						container.remove(region);
						container.doLayout();
					}
				},{
					text:"增加西",
					handler:function() {
						var container = view.items.items[0];
						var region = container.find("region", "west")[0];
						if (region)
						{
							return;
						}
						container.add({
							title: 'West Panel',
							region:'west',
							margins: '5 0 0 5',
							cmargins: '5 5 0 5',
							width: 200,
							minSize: 100,
							maxSize: 300
						});
						container.doLayout();
					}
				},{
					text:"去除西",
					handler:function() {
						var container = view.items.items[0];
						var region = container.find("region", "west")[0];
						container.remove(region);
						container.doLayout();
					}
				}]

			}]
		}
	})
})
分享到:
评论
4 楼 cwocwo 2008-08-09  
上面的问题,现在这样解决:
if (region) {
	var splitBar = Ext.DomQuery.selectNode("div[@class*='x-layout-split x-layout-split-west']");
	if(splitBar) {
		//alert(splitBar.id);
		Ext.get(splitBar.id).remove();
	}
	container.remove(region);
	container.doLayout();
}
3 楼 cwocwo 2008-08-09  
当动态添加、删除splitregion时, splitBar删不掉, 需要手工删除。
2 楼 nihongye 2008-08-04  
嗯,关于内存释放的问题,确认了问题的原因,怎样解决不清楚。modal:false,shadow:false可以,但是相应的特性就没有了
1 楼 dxb86 2008-08-03  
非常感谢你的文章..........

不过 我在你有次的回复关于EXTJS 释放内存的方式

可以稍微指点下吗?

你说的去掉MODAL 还有SHADOW

主要是去掉哪些关键代码?

很容易都去掉出错了。。。。

MODAL:..

SHADOW:..

只去掉这样的吗?

打扰之处见谅......

愿你工作顺利

相关推荐

    Ext_2.2_API(chinese).rar_Ext 2.2 API_ext js 2_ext-2.2 api_ext2.2

    这个API文档的中文版,"Ext_2.2_API(chinese).rar_Ext 2.2 API_ext js 2_ext-2.2 api_ext2.2",是针对Ext JS 2.2框架的重要参考资料,对于开发者来说尤其有价值,特别是那些中文为母语的开发者,它使得理解框架的...

    ext实例 ext操作步骤

    通过`Ext.layout.BorderLayout`定义,可以灵活地在各个区域内放置组件,实现复杂的页面结构。 3. **Column布局**:使用`Ext.layout.ColumnLayout`,将容器视为一列,通过`columnWidth`或`width`属性来设定子组件...

    EXT中文教程

    EXT提供了多种布局方式,如CardLayout、BorderLayout等,用于控制组件在页面中的位置和大小,实现复杂多变的界面布局。 #### 4. Grid组件与表单组件 - **Grid组件** Grid是EXT中用于展示表格数据的组件,支持...

    Ext2.2 中文手册

    - **Ext2 概述**:提供了 Ext2 版本的主要特性和新组件的介绍。 - **组件模型**:解释了 Ext 中的组件模型,包括基本组件和容器。 - **容器模型**:详细介绍了容器组件的作用和用法。 - **布局 Layouts**:列举了...

    ext的课件,ppt版,适合有面向对象基础人士

    2. Border布局:基于`Ext.layout.BorderLayout`,它将容器划分为五个区域:东(east)、南(south)、西(west)、北(north)和中心(center)。子组件可以通过指定它们的位置来放置,实现灵活的多面板布局。 3. ...

    EXT教程EXT用大量的实例演示Ext实例

    Ext提供了多种弹出窗口组件,如MessageBox等,这些组件可自定义各种动画效果和布局,甚至可以在弹出窗口中嵌入表格和表单。Ext JS对布局的处理很灵活,可以轻松实现不同浏览器中的统一布局效果。其中BorderLayout是...

    ext学习资料和rar

    2. **布局管理**:EXT提供了多种布局模式,如Fit布局、FormLayout、TableLayout、BorderLayout等,用于调整组件在容器中的排列方式,确保界面自适应和响应式。 3. **数据绑定**:EXT支持双向数据绑定,允许UI组件与...

    EXT 布局 Layout 资料

    **Border** 布局由类 `Ext.layout.BorderLayout` 定义,其布局名称为 `border`。Border 布局将容器划分为五个区域:东 (`east`)、南 (`south`)、西 (`west`)、北 (`north`) 和中心 (`center`)。 在向容器添加子元素...

    EXT中文手册5.pdf

    `BorderLayout` 是 Ext JS 提供的一种布局管理器,它将容器划分为五个区域:北(North)、南(South)、东(East)、西(West)以及中心(Center)。每个区域可以放置一个面板或组件。 #### 1.2 BorderLayout 的...

    EXT中文手册 Grid Form

    - EXT支持多种布局策略,如CardLayout、BorderLayout等,可以灵活地控制组件的位置和大小。 - **Grid** - Grid组件是EXT中用于展示表格数据的重要组件,支持数据的排序、筛选等功能。 - **XTemplate** - ...

    EXT 中文手册

    - **组件模型**:EXT2 对组件模型进行了优化,使得组件的定义和使用更加灵活。 - **容器模型**:容器模型是用于组织和管理组件的高级概念,EXT2 中的容器模型更加完善。 - **布局**:EXT2 提供了更多布局选项,以...

    gwt-ext 实例

    4. **布局管理**:学习gwt-ext提供的布局管理器,如FitLayout、BorderLayout、ColumnLayout,以及如何在组件间进行布局和对齐。 5. **数据绑定**:gwt-ext支持数据绑定,可以使UI组件的状态与后台数据模型保持同步...

    asp.net ext 中文手册

    除了上述核心知识点,文档还提供了一系列补充资料,包括EXT2的新特性、组件模型、容器模型、布局、Grid、XTemplate、DataView等。这些资料有助于开发者全面了解EXT的发展历程和技术生态,为进阶学习打下坚实基础。

    基于ext的j2ee开发

    首先介绍了Ext框架的基本特性和优势,然后讨论了Ext与Struts2的整合方法,以及如何使用JSON作为前后端数据交换的格式。最后,文中还概述了Struts2、Spring和Ibatis之间如何进行整合,旨在构建一个完整的快速开发架构...

    Ext2.0 概述.doc

    3. **布局 (Layouts)**: EXT2.0对布局系统进行了全面改革,引入了多种新的布局模式,包括BorderLayout在内的九种布局方式。布局管理变得更加灵活,减少了开发者处理复杂布局实现的负担。 4. **网格 (Grid)**: Grid...

    ext 实例

    2. **布局管理**:EXT的布局系统允许开发者灵活地组织和调整组件的位置和大小。例如,可以使用`BorderLayout`将页面分为头部(包含标题)、主体(显示留言列表)和底部(包含表单)三个区域。 3. **数据绑定**:EXT...

    Ext教程.pptExt教程.pptExt教程.ppt

    2. **Border布局**:基于`Ext.layout.BorderLayout`,分为五个区域:东(east)、南(south)、西(west)、北(north)和中心(center)。这种布局允许开发者将界面分割成这些区域,并将组件放置在相应的区域内,非常适合创建...

    Gwt-Ext基础-中级-进阶

    2. **Gwt-Ext介绍**:Gwt-Ext是在GWT基础上构建的,它提供了更多的UI组件,如表格、树、图表等,以及更丰富的样式和布局管理。 3. **环境搭建**:如何配置Java环境,安装并设置GWT SDK,以及引入Gwt-Ext库到项目中...

Global site tag (gtag.js) - Google Analytics