因为问答频道询问这个问题,自己也遇到过,以前是用动态改变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();
}
}]
}]
}
})
})
分享到:
- 2008-08-01 12:03
- 浏览 5209
- 评论(4)
- 论坛回复 / 浏览 (4 / 5237)
- 查看更多
相关推荐
这个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.layout.BorderLayout`定义,可以灵活地在各个区域内放置组件,实现复杂的页面结构。 3. **Column布局**:使用`Ext.layout.ColumnLayout`,将容器视为一列,通过`columnWidth`或`width`属性来设定子组件...
EXT提供了多种布局方式,如CardLayout、BorderLayout等,用于控制组件在页面中的位置和大小,实现复杂多变的界面布局。 #### 4. Grid组件与表单组件 - **Grid组件** Grid是EXT中用于展示表格数据的组件,支持...
- **Ext2 概述**:提供了 Ext2 版本的主要特性和新组件的介绍。 - **组件模型**:解释了 Ext 中的组件模型,包括基本组件和容器。 - **容器模型**:详细介绍了容器组件的作用和用法。 - **布局 Layouts**:列举了...
2. Border布局:基于`Ext.layout.BorderLayout`,它将容器划分为五个区域:东(east)、南(south)、西(west)、北(north)和中心(center)。子组件可以通过指定它们的位置来放置,实现灵活的多面板布局。 3. ...
Ext提供了多种弹出窗口组件,如MessageBox等,这些组件可自定义各种动画效果和布局,甚至可以在弹出窗口中嵌入表格和表单。Ext JS对布局的处理很灵活,可以轻松实现不同浏览器中的统一布局效果。其中BorderLayout是...
2. **布局管理**:EXT提供了多种布局模式,如Fit布局、FormLayout、TableLayout、BorderLayout等,用于调整组件在容器中的排列方式,确保界面自适应和响应式。 3. **数据绑定**:EXT支持双向数据绑定,允许UI组件与...
**Border** 布局由类 `Ext.layout.BorderLayout` 定义,其布局名称为 `border`。Border 布局将容器划分为五个区域:东 (`east`)、南 (`south`)、西 (`west`)、北 (`north`) 和中心 (`center`)。 在向容器添加子元素...
`BorderLayout` 是 Ext JS 提供的一种布局管理器,它将容器划分为五个区域:北(North)、南(South)、东(East)、西(West)以及中心(Center)。每个区域可以放置一个面板或组件。 #### 1.2 BorderLayout 的...
- EXT支持多种布局策略,如CardLayout、BorderLayout等,可以灵活地控制组件的位置和大小。 - **Grid** - Grid组件是EXT中用于展示表格数据的重要组件,支持数据的排序、筛选等功能。 - **XTemplate** - ...
- **组件模型**:EXT2 对组件模型进行了优化,使得组件的定义和使用更加灵活。 - **容器模型**:容器模型是用于组织和管理组件的高级概念,EXT2 中的容器模型更加完善。 - **布局**:EXT2 提供了更多布局选项,以...
4. **布局管理**:学习gwt-ext提供的布局管理器,如FitLayout、BorderLayout、ColumnLayout,以及如何在组件间进行布局和对齐。 5. **数据绑定**:gwt-ext支持数据绑定,可以使UI组件的状态与后台数据模型保持同步...
除了上述核心知识点,文档还提供了一系列补充资料,包括EXT2的新特性、组件模型、容器模型、布局、Grid、XTemplate、DataView等。这些资料有助于开发者全面了解EXT的发展历程和技术生态,为进阶学习打下坚实基础。
首先介绍了Ext框架的基本特性和优势,然后讨论了Ext与Struts2的整合方法,以及如何使用JSON作为前后端数据交换的格式。最后,文中还概述了Struts2、Spring和Ibatis之间如何进行整合,旨在构建一个完整的快速开发架构...
3. **布局 (Layouts)**: EXT2.0对布局系统进行了全面改革,引入了多种新的布局模式,包括BorderLayout在内的九种布局方式。布局管理变得更加灵活,减少了开发者处理复杂布局实现的负担。 4. **网格 (Grid)**: Grid...
2. **布局管理**:EXT的布局系统允许开发者灵活地组织和调整组件的位置和大小。例如,可以使用`BorderLayout`将页面分为头部(包含标题)、主体(显示留言列表)和底部(包含表单)三个区域。 3. **数据绑定**:EXT...
2. **Border布局**:基于`Ext.layout.BorderLayout`,分为五个区域:东(east)、南(south)、西(west)、北(north)和中心(center)。这种布局允许开发者将界面分割成这些区域,并将组件放置在相应的区域内,非常适合创建...
2. **Gwt-Ext介绍**:Gwt-Ext是在GWT基础上构建的,它提供了更多的UI组件,如表格、树、图表等,以及更丰富的样式和布局管理。 3. **环境搭建**:如何配置Java环境,安装并设置GWT SDK,以及引入Gwt-Ext库到项目中...