`
hackbomb
  • 浏览: 217146 次
  • 性别: Icon_minigender_1
  • 来自: 上海
社区版块
存档分类
最新评论

ColumnLayout的使用方法

    博客分类:
  • Ext
阅读更多

CoulumnLayout是经常用到的布局类型,但也是让人感到迷惑的布局。主要原因是同一效果的定义方法有多种。笔者在早期的一篇博文虽然也做过讲解,但是因为例子写的是简洁的写法,反而没把问题说清楚,实在深感抱歉。

总体上说要达到同一效果,CoulumnLayout的定义方法有以下4种:

■      一行定义一个CoulumnLayout,每列中只有一个控件

■      只定义一个CoulumnLayout,每列中只有一个控件

■      只定义一个CoulumnLayout,每列中有多个控件

■      一行一个CoulumnLayout,每列中有多个控件

 

下面通过例子详细说明一下这4种方法以及它们的优缺点。

(1)       一行定义一个CoulumnLayout,每列中只有一个控件的定义方法

该方法是最笨的方法,但是却是最实用的方法,也是笔者强烈推荐的方法。

为什么说该方法笨呢?请先看以下源代码:

         Ext.onReady(function(){

                   var frm = new Ext.form.FormPanel({  

                            applyTo: "form1",

                            autoHeight: true,

                            width: 750,

                            frame: true,

                            labelWidth:80,

                            labelSeparator:":",

                            title:'一行定义一个CoulumnLayout,每列中只有一个控件',

                            items:[

                                     //第一行

                          {layout:'column',border:false,items:[

                                    //第一列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行一列',name:'text1-1-1',anchor:'90%'}

                                               ]},

                                    //第二列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行二列',name:'text1-1-2',anchor:'90%'}

                                               ]},

                                    //第三列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行三列',name:'text1-1-3',anchor:'90%'}

                                               ]}

                                     ]},

                                     //第二行

                          {layout:'column',border:false,items:[

                                    //第一列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'二行一列',name:'text1-2-1',anchor:'90%'}

                                               ]},

                                    //第二列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'二行二列',name:'text1-2-2',anchor:'90%'}

                                               ]}

                                     ]},

                                     //第三行

                          {layout:'column',border:false,items:[

                                    //第一列

                                    {columnWidth:.25,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',fieldLabel:'三行一列',boxLabel:'三行一列',name:'text1-3-1',anchor:'90%'}

                                               ]},

                                    //第二列

                                    {columnWidth:.15,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',hideLabel:true,boxLabel:'三行二列',name:'text1-3-2',anchor:'90%'}

                                               ]},

                                    //第三列

                                    {columnWidth:.15,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',hideLabel:true,boxLabel:'三行三列',name:'text1-3-3',anchor:'90%'}

                                               ]}

                                     ]}

                            ]

                   });
 

 看出该方法如何笨了吧?就是每定义一行就要重新定义一个CoulumnLayout:

{columnWidth:.3,layout: 'form',border:false,items: [[ /* 子组件 */]}
 

 

而且每行中的每列只定义一个控件:

                                    //第一列

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行一列',name:'text1-1-1',anchor:'90%'}

                                               ]},
 

 

这样不是要写多很多代码?确实够笨的。不过笔者认为笨不要紧,关键是能解决大问题。每行定义一个CoulumnLayout, 行与行之间相互独立起来,就不会互相影响了,尤其是定义第三行这样需要紧凑结构,不规则的行尤其适合。这样还有一个好处就是可以减少计算columnWidth的时间与配置tabIndex的问题。尤其是在已经有很多控件,要在中间中插入一个新的控件时,你会觉得还是该方法挺实用的。为什么会这样?请继续往下看其它方法。

 

(2)      只定义一个CoulumnLayout,每列中只有一个控件的方法

该方法顾名思义,就是不管三七二十一,就只定义一个CoulumnLayout,分行的问题由列自己解决。

列是如何自动分行的?是通过属性columnWidth来实现的。分行的原则就是从第一列的columnWidth开始计算,每当n(n>=1)列的columnWidth的和超过1的时候就会自动换行,然后从第n列重新开始计算,依此类推直到最后一列。

明白这个原则后,咱们来看看该方法的源代码:


                   var frm2 = new Ext.form.FormPanel({

                            applyTo: "form2",

                            autoHeight: true,

                            width: 750,

                            frame: true,

                            labelWidth:80,

                            labelSeparator:":",

                            title:'只定义一个CoulumnLayout,每列中只有一个控件',

                            items:[

                          {layout:'column',border:false,items:[

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行一列',name:'text2-1-1',anchor:'90%'}

                                               ]},

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行二列',name:'text2-1-2',anchor:'90%'}

                                               ]},

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'一行三列',name:'text2-1-3',anchor:'90%'}

                                               ]},

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'二行一列',name:'text2-2-1',anchor:'90%'}

                                               ]},

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'textfield',fieldLabel:'二行二列',name:'text2-2-2',anchor:'90%'}

                                               ]},

                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'panel',html:' ',height:26}

                                               ]},

                                    {columnWidth:.25,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',fieldLabel:'三行一列',boxLabel:'三行一列',name:'text2-3-1',anchor:'90%'}

                                               ]},

                                    {columnWidth:.15,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',hideLabel:true,boxLabel:'三行二列',name:'text2-3-2',anchor:'90%'}

                                               ]},

                                    {columnWidth:.15,layout: 'form',border:false,items: [

                                             {xtype:'checkbox',hideLabel:true,boxLabel:'三行三列',name:'text2-3-3',anchor:'90%'}

                                               ]}

                                     ]}

                            ]

                   });
 

 

代码中只定义了一个CoulumnLayout,然后全是列定义。前面3个列的columnWidth都是0.3,再加上第4列的columnWidth就是1.2了,已经超过1了,因而从第4列开始是第2行了。第2行只有2个列,columnWidth的总和才0.6,再加上第3行的第1列的columnWidth才是0.85,还不到1,所以会出现图3的错误。解决办法就是增加一个空列来补足宽度:


                                    {columnWidth:.3,layout: 'form',border:false,items: [

                                             {xtype:'panel',html:' ',height:26}

                                               ]},
 
 注意到没有,在列中使用了一个高度为26,内容为一个空白字符的panel作为控件。为什么要这样呢?做个测试,把" "和高度先去掉,看看效果,问题依然如故。奇怪吧?这还是和CSS有关,一个空的DIV不占任何宽度和高度,所以在实际的HTML源代码中根本没把增加的columnWidth算进去。居然这样,就加回" "看看。奇怪了,图3的结果怎么还是错误的?不过和图2有些不同了,第3行第1列的位置偏下了。其实又是CSS作怪,高度不足引起的,再加入"height:26"就一切正常了。

分享到:
评论
1 楼 李君寻 2012-08-23  
自动换行,算是懂了

相关推荐

    Ext布局类的介绍与使用

    例如,可以在center区域使用GridPanel布局,同时在west区域使用ColumnLayout。NestedLayoutPanel的使用方法与BorderLayout类似,只是在配置上更加灵活,可以适应更复杂的布局需求。 在使用EXT布局时,还需要注意...

    qt中实现fluentui超璇ui客户端,实现客户端程序的前后端分离及超炫界面

    Qt Quick的Layouts模块提供了一些方便的布局组件,如ColumnLayout和RowLayout,可以确保元素在不同屏幕尺寸下都能正确对齐和缩放。 6. **前后端分离**:在实现客户端程序的前后端分离时,通常会使用模型-视图-控制...

    ExtJS使用笔记

    ExtJS是一个开源的JavaScript库,主要用于...通过本笔记的学习,可以掌握ExtJS在前端开发中的应用,理解各个组件和管理器的使用方法,以及一些针对特定浏览器的布局技巧,为创建美观、高效的用户界面打下坚实的基础。

    一个可以自适应换行的标签列表控件

    3. **流式布局**:为了实现自适应换行,开发者可能使用了FlowLayout或自定义的ColumnLayout。FlowLayout是一个非官方的Android库,它允许子视图按照行优先的方式排列,而ColumnLayout则可能是专门为实现这种功能定制...

    基于qml开发触摸屏效果软件方法

    通过使用`Layout`模块,我们可以创建在各种设备上都能良好显示的用户界面。 ```qml import QtQuick.Layouts 1.0 ColumnLayout { anchors.fill: parent Rectangle { Layout.fillWidth: true Layout.minimum...

    Ext2.0 form使用实例

    本文将详细介绍Ext2.0 FormPanel的使用,包括创建方法、控件配置以及布局管理。 首先,我们需要初始化提示信息功能和设置错误信息显示位置。通过`Ext.QuickTips.init()`启动快速提示功能,以便为表单中的控件提供...

    Ext10种布局

    - **使用方法**:添加子元素时,只需指定它们位于哪个区域,布局会自动将子元素放置到相应位置。 #### 3. 列布局(Column Layout) - **定义**:通过 `Ext.layout.ColumnLayout` 类定义,布局名称为 `column`。 - ...

    EXT2.0帮助文档CHM版

    EXT的布局系统是其灵活性的关键,包括Fit布局、Border布局、ColumnLayout等多种布局模式,可以帮助开发者根据需求构建各种复杂界面。通过API文档,开发者可以深入理解每种布局的工作原理和使用场景。 CHM(Compiled...

    qml实现登录界面

    在上面的代码中,我们使用ColumnLayout将各个组件垂直排列,形成一个简洁的登录表单。当用户点击“登录”按钮时,可以编写JavaScript或C++代码来处理登录逻辑,例如验证用户名和密码的有效性。 关于界面跳转,Qt ...

    WEB应用组件开发指南

    - **`ColumnLayout`**: 介绍了一种列布局策略。 **3.4 Grid类** - **`GridPanel`**: 介绍了一个网格面板组件,用于展示表格数据。 - **`EditorGridPanel`**: 介绍了一个支持编辑的网格面板组件。 - **`...

    extjs3.0例子

    在这个“extjs3.0例子”中,我们将深入探讨EXTJS的核心概念、常用对象及其使用方法。 EXTJS的核心在于它的组件模型,其中包括窗口(Window)、面板(Panel)、表格(Grid)、表单(Form)、菜单(Menu)等。这些...

    ext表单

    在FormPanel中,我们可以添加FieldSet来分组相关的表单元素,或者使用ColumnLayout或FitLayout等布局管理器来调整表单组件的显示方式。 数据绑定是EXT表单的一大特色,它允许表单组件与数据模型之间实时同步。这...

    QML + 日历功能Demo

    9. **布局(Layouts)**:为了组织和定位界面元素,QML提供了布局管理器,如`ColumnLayout`和`RowLayout`,用于按列或行排列组件。 在压缩包文件`MyCalendar`中,可能包含了实现这些功能的QML源文件,以及可能的CSS...

    QmlCircularProgress.7z

    本篇文章将深入探讨QmlCircularProgress的使用方法和相关知识。 首先,我们来理解QmlCircularProgress的基本结构。QmlCircularProgress是QtQuick.Controls模块的一部分,通过`import QtQuick.Controls 2.x`引入,...

    mGui:用于更清洁的Maya GUI布局语法的Python模块

    mGui用于简化Maya GUI编码的模块基本mGui是一个Python模块,用于使用Maya的内置GUI小部件简化GUI创建。 因此,它不能替代更复杂的功能(例如PyQT或PySide),而是一种可以更快,更可靠地制作简单UI(并且无需在较早...

    gwt-ext 实例

    3. **创建UI组件**:使用gwt-ext库创建各种组件,如Grid、FormPanel、ComboBox等,并了解它们的属性、方法和事件处理。 4. **布局管理**:学习gwt-ext提供的布局管理器,如FitLayout、BorderLayout、ColumnLayout,...

    Gwt-Ext基础-中级-进阶

    6. **布局管理**:理解各种布局管理器,如AbsoluteLayout、BorderLayout、ColumnLayout、FitLayout等,以及如何在应用中灵活使用它们。 7. **数据绑定**:Gwt-Ext的数据绑定机制,包括模型(Model)、视图(View)...

    PySide6 Python+QML例程.zip

    ColumnLayout { MyModel { id: model } Label { text: model.count } Button { text: "Increment" onClicked: model.count += 1 } } } ``` 这个例子展示了如何在Python和QML之间传递数据,以及如何响应...

    Eclipse_Swt_Jface_核心应用_部分19

    12.6.1 使用绘制对象的方法 257 12.6.2 绘制线条 258 12.6.3 绘制字符 259 12.6.4 绘制填充图形 260 12.6.5 绘制图像 261 12.7 本章小结 261 第13章 SWT的高级应用.. 262 13.1 打印支持 262 13.1.1 ...

Global site tag (gtag.js) - Google Analytics