使用 CellRenderer API

必须编写一个包含四个方法(CellRenderer.getPreferredHeight()CellRenderer.getPreferredWidth()CellRenderer.setSize()CellRenderer.setValue())的类,基于列表的组件使用该类与单元格通信(如果该类是 UIObject 的扩展类,则可以使用 size() 来代替 CellRenderer.setSize())。在 Flash 应用程序中,必须在影片剪辑元件的"链接属性"对话框中的"AS 2.0 类"文本框中指定该类。

您可以在一个示例文件中查看实现单元格渲染器 API 的 CheckCellRenderer 类;该文件位于 First Run/classes/mx/controls/cells 中。此外,还可以查看 DataGrid 组件文档(包括DataGrid 性能策略)来获取有关 CellRenderer 的信息。

系统将为单元格自动指定两个方法和一个属性(CellRenderer.getCellIndex()CellRenderer.getDataLabel()CellRenderer.listOwner),以便允许它与基于列表的组件通信。例如,假设单元格包含一个复选框,选中该复选框时会有一行被选中。单元格渲染器需要引用包含它的基于列表的组件,才能调用组件的 selectedIndex 属性。同时,单元格需要知道它当前正在呈现的项索引,以便能够将 selectedIndex 设置为正确的编号;单元格可以使用 CellRenderer.listOwnerCellRenderer.getCellIndex() 达到此目的。您不需要实现这些 ActionScript 元素;在将单元格放到基于列表的组件内时,单元格将自动接收这些元素。

单元格渲染器简单示例

本节介绍在一个单元格中显示多行文本的单元格渲染器的示例。

以下教程演示如何创建一个在 DataGrid 组件的单元格中显示多行文本的单元格渲染器类。

完成的文件 MultiLineCell.as 和 CellRenderer_tutorial.fla 位于 www.macromedia.com/go/component_samples 中。

创建 MultiLineCell 单元格渲染器类

单元格渲染器类必须实现以下方法:

单元格渲染器类还必须声明从 List 类接收的方法和属性:

下列步骤说明如何创建一个名为 MultiLineCell.as 的 ActionScript 2.0 单元格渲染器类文件,并将该文件链接到新 Flash 文档中的新影片剪辑元件。这样,可以将 DataGrid 组件添加到 Flash 文档库中。在第一帧上,添加 ActionScript,以动态创建 DataGrid 并将 MultiLineCell 类指定为该网格某一列的单元格渲染器:

若要创建 multiLineCell 单元格渲染器类,请执行以下操作:

  1. 在 Flash 中,选择"文件">"新建">"ActionScript 文件"(不是"Flash 文档")。将该文档另存为 MultiLineCell.as
  2. 在 MultiLineCell.as 中输入以下代码:
    // ActionScript 2.0 class.
    class MultiLineCell extends mx.core.UIComponent
    {
        private var multiLineLabel; // 用于显示文本的标签。
        private var owner; // 包含此单元格的行。
        private var listOwner; // 包含此单元格的列表、数据网格或树。
    
        // 单元格高度相对于行总高度的偏移量以及首选的单元格宽度。
        private static var PREFERRED_HEIGHT_OFFSET = 4; 
        private static var PREFERRED_WIDTH = 100;
        // 起始深度。
        private var startDepth:Number = 1;
    
        // 构造函数。应为空。
        public function MultiLineCell()
        {
        }
    
        /* UIObject 期望您通过实例化初始化期间可能需要的所有影片剪辑资源来填充 createChildren。在本例中,我们创建的是一个标签*/
        public function createChildren():Void
        {
            // createLabel 方法是 UIObject 的一种很有用的方法,并且是一种
            // 在组件中创建标签的便利方法。
            var c = multiLineLabel = this.createLabel("multiLineLabel", startDepth);
            // 将该标签的样式链接到网格的样式
            c.styleName = listOwner;
            c.selectable = false;
            c.tabEnabled = false;
            c.background = false;
            c.border = false;
            c.multiline = true;
            c.wordWrap = true;
        }
    
        public function size():Void
        {
    /* 通过扩展用于导入 UIObject 的 UIComponent,将自动获取 setSize,但 UIComponent 期望您实现 size()。假设现在为您设置了 __width 和 __height。您将要扩展单元格以适应整个 rowHeight。rowHeight 本身是要在其中呈现单元格的列表类型组件的属性。由于我们需要 rowHeight 适合两行的高度,因此在使用此 cellRenderer 类创建该列表类型组件时,请确保将其 rowHeight 属性设置为足够大,以便在该组件中可以呈现两行文本。*/
        
    /*__width 和 __height 是 getter/setter  .width 和 .height 的基础变量。*/
            var c = multiLineLabel;
            c.setSize(__width, __height);
        }
    
        // 提供单元格的首选高度。继承的方法。
        public function getPreferredHeight():Number
        {
    /* 为单元格赋予一个引用行的属性"owner"。首选的做法总是让单元格占用行的大部分高度。在本例中,我们将使单元格略小一些。*/
            return owner.__height - PREFERRED_HEIGHT_OFFSET;
        }
    
        // 由 owner 调用以设置单元格中的值。继承的方法。
        public function setValue(suggestedValue:String, item:Object, selected:Boolean):Void
        {
    /* 如果未定义 item 参数,则不应在单元格中呈现任何内容,因此将标签设置为不可见。注意:对于滚动列表类型组件(如滚动数据网格),在单元格刚滚动出视线之外时就使其为空,然后再次重用该单元格,并为其设置产生滚动动画效果的新值。出于此原因,您不能指望任一单元格始终包含要显示的数据或包含同一值。*/
            if (item!=undefined){
                multiLineLabel.text._visible = false;
            }
            multiLineLabel.text = suggestedValue;
        }
        // 函数 getPreferredWidth ::仅用于菜单和数据网格标题
        // 函数 getCellIndex ::在此单元格渲染器中不使用
        // 函数 getDataLabel ::在此单元格渲染器中不使用
    }
    

创建应用程序以测试 MultiLineCell 单元格渲染器类

在下列步骤中,将创建 DataGrid 实例并实现 MultiLineCell 类。

创建一个应用程序,该应用程序包含一个使用 MultiLineCell 单元格渲染器类的 DataGrid 组件:

  1. 在 Flash 中,选择"文件">"新建">"Flash 文档"。
  2. 选择"文件">"另存为",将该文件命名为 cellRender_tutorial.fla,然后将其保存到 MultiLineCell.as 文件所在的同一文件夹中。
  3. 若要创建新的 movieClip 元件以链接到 MultiLineCell 类,请选择"插入">"新元件"。
  4. 单击"创建新元件"对话框右下角的"高级"按钮以启用更多选项。

    当您处于"创建新元件"对话框的基本模式下时,可以看到"高级"按钮。如果看不到"高级"按钮,您很可能已经在该对话框的"高级"视图下。

  5. 在"名称"文本框中键入 MultiLineCell

    "类型"的默认值为"影片剪辑"。保留"影片剪辑"的选中状态。

  6. 在"链接"部分单击"为 ActionScript 导出"复选框。

    启用此选项将允许您在运行期间将此元件的实例动态地附加到 Flash 文档。"标识符"文本框将自动显示 MultiLineCell。

  7. 将"ActionScript 2.0 类"设置为 MultiLineCell(以匹配先前创建的 MultiLineCell 单元格渲染器类的名称)。
  8. 最后,启用"在第一帧导出"复选框,然后单击"确定"以应用更改并关闭对话框。

    注意

    如果以后需要修改"MultiLineCell 影片剪辑"元件的链接属性,可以在文档库中右击该元件,并从所显示的菜单中选择"属性"或"链接"。

  9. 将 DataGrid 组件从"组件"面板拖到库中。

    在下一步中将通过 ActionScript 动态创建 DataGrid 实例。

  10. 选择主时间轴上的第一帧(确保您尚未处于 MultiLineCell 影片剪辑编辑模式下)。
  11. 在第一帧的"动作"面板中,输入以下代码,以动态创建 DataGrid、向 DataGrid 分配数据并分配新的单元格渲染器类:
    // 创建一个新的 DataGrid 组件实例
    this.createClassObject(mx.controls.DataGrid, "myGrid_dg", 1);
    
    // 为包含四列数据的数据网格构建一个数据提供程序。
    myDP = new Array();
    var aLongString:String = "An example of a cell renderer class that displays a multiple line TextField";
    myDP.addItem({firstName:"Winston", lastName:"Elstad", note:aLongString, item:100});
    myDP.addItem({firstName:"Ric", lastName:"Dietrich", note:aLongString, item:101});   
    myDP.addItem({firstName:"Ewing", lastName:"Canepa", note:aLongString, item:102});   
    myDP.addItem({firstName:"Kevin", lastName:"Wade", note:aLongString, item:103});   
    myDP.addItem({firstName:"Kimberly", lastName:"Dietrich", note:aLongString, item:104});   
    myDP.addItem({firstName:"AJ", lastName:"Bilow", note:aLongString, item:105});   
    myDP.addItem({firstName:"Chuck", lastName:"Yushan", note:aLongString, item:106});
    myDP.addItem({firstName:"John", lastName:"Roo", note:aLongString, item:107});
    
    /* 将该数据提供程序分配到 DataGrid 以填充该网格。注意:必须在应用 cellRenderer 之前执行此操作。*/
    myGrid_dg.dataProvider = myDP;
    
    /* 设置某些基本的网格属性。注意:该数据网格的行高应反映您期望在 MultiLineCell 单元格渲染器中显示的行数。单元格渲染器将调整为该行高度。对于默认文本大小,该行高度大约是两行文本的行高 40 或三行文本的行高 60。*/
    myGrid_dg.setSize(430,200);
    myGrid_dg.move(40,40);
    myGrid_dg.rowHeight = 40; // 对于默认文本大小,使用两行文本的行高。
    myGrid_dg.getColumnAt(0).width = 70;
    myGrid_dg.getColumnAt(1).width = 70;
    myGrid_dg.getColumnAt(2).width = 220;
    myGrid_dg.resizableColumns = true;
    myGrid_dg.vScrollPolicy = "auto";
    myGrid_dg.setStyle("backgroundColor", 0xD5D5FF); 
    
    // 分配 cellRenderer。
    myGrid_dg.getColumnAt(2).cellRenderer = "MultiLineCell";
    
  12. 保存 Flash 文档,并选择"控制">"测试影片"。

    将显示一个数据网格。该数据网格的第三列包含一个多行单元格。

完成的 MultiLineCell 单元格渲染器示例。


其它单元格渲染器示例

此外,还提供了显示 ComboBox 和 CheckCell 组件的其它单元格渲染器类示例。这些文件位于 CellRenderers_sample 文件夹中,该文件夹包含在硬盘上的 Samples and Tutorials 文件夹中。也可从以下网址下载这些文件:www.macromedia.com/go/component_samples

另一个显示 ComboBox 和 CheckBox 的名为 CellRenderers_Sample 的已安装范例。


要为 CellRenderer API 实现的方法

您必须编写包含以下方法的类,以便 List、DataGrid、Tree 或 Menu 组件可以与单元格通信。

方法

说明

CellRenderer.getPreferredHeight()

返回单元格的首选高度。

CellRenderer.getPreferredWidth()

单元格的首选宽度。

CellRenderer.setSize()

设置单元格的宽度和高度。

CellRenderer.setValue()

设置要显示在单元格中的内容。

CellRenderer API 提供的方法

以下是在组件内创建单元格时 List、DataGrid、Tree 和 Menu 组件为单元格指定的方法。您无需实现这些方法。

方法

说明

CellRenderer.getCellIndex()

返回包含两个字段(columnIndexitemIndex)的对象,这两个字段指示单元格的位置。

CellRenderer.getDataLabel()

返回包含单元格渲染器数据字段的名称的字符串。

CellRenderer API 提供的属性

以下是在组件内创建单元格时 List、DataGrid、Tree 和 Menu 组件为单元格指定的属性。您无需实现这些属性。

属性

说明

CellRenderer.listOwner

指向包含单元格的 List 组件的引用。

CellRenderer.owner

指向包含单元格的行的引用。