组件语言参考 |
|
|
|
| CellRenderer API > 使用 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.listOwner 和 CellRenderer.getCellIndex() 达到此目的。您不需要实现这些 ActionScript 元素;在将单元格放到基于列表的组件内时,单元格将自动接收这些元素。
本节介绍在一个单元格中显示多行文本的单元格渲染器的示例。
以下教程演示如何创建一个在 DataGrid 组件的单元格中显示多行文本的单元格渲染器类。
完成的文件 MultiLineCell.as 和 CellRenderer_tutorial.fla 位于 www.macromedia.com/go/component_samples 中。
单元格渲染器类必须实现以下方法:
仅 Menu 组件或 DataGrid 标题需要 CellRenderer.getPreferredWidth() 方法;其它情况下,请按照本示例所示的方法从代码中注释掉该方法。
如果单元格渲染器类是 UIObject 的扩展类,请按照本示例所示改为使用 implement size()。
单元格渲染器类还必须声明从 List 类接收的方法和属性:
下列步骤说明如何创建一个名为 MultiLineCell.as 的 ActionScript 2.0 单元格渲染器类文件,并将该文件链接到新 Flash 文档中的新影片剪辑元件。这样,可以将 DataGrid 组件添加到 Flash 文档库中。在第一帧上,添加 ActionScript,以动态创建 DataGrid 并将 MultiLineCell 类指定为该网格某一列的单元格渲染器:
若要创建 multiLineCell 单元格渲染器类,请执行以下操作:
// 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 ::在此单元格渲染器中不使用
}
在下列步骤中,将创建 DataGrid 实例并实现 MultiLineCell 类。
创建一个应用程序,该应用程序包含一个使用 MultiLineCell 单元格渲染器类的 DataGrid 组件:当您处于"创建新元件"对话框的基本模式下时,可以看到"高级"按钮。如果看不到"高级"按钮,您很可能已经在该对话框的"高级"视图下。
"类型"的默认值为"影片剪辑"。保留"影片剪辑"的选中状态。
启用此选项将允许您在运行期间将此元件的实例动态地附加到 Flash 文档。"标识符"文本框将自动显示 MultiLineCell。
|
注意 |
如果以后需要修改"MultiLineCell 影片剪辑"元件的链接属性,可以在文档库中右击该元件,并从所显示的菜单中选择"属性"或"链接"。 |
在下一步中将通过 ActionScript 动态创建 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";
将显示一个数据网格。该数据网格的第三列包含一个多行单元格。

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

另一个显示 ComboBox 和 CheckBox 的名为 CellRenderers_Sample 的已安装范例。
您必须编写包含以下方法的类,以便 List、DataGrid、Tree 或 Menu 组件可以与单元格通信。
|
方法 |
说明 |
|---|---|
|
返回单元格的首选高度。 |
|
|
单元格的首选宽度。 |
|
|
设置单元格的宽度和高度。 |
|
|
设置要显示在单元格中的内容。 |
以下是在组件内创建单元格时 List、DataGrid、Tree 和 Menu 组件为单元格指定的方法。您无需实现这些方法。
|
方法 |
说明 |
|---|---|
|
返回包含两个字段( |
|
|
返回包含单元格渲染器数据字段的名称的字符串。 |
以下是在组件内创建单元格时 List、DataGrid、Tree 和 Menu 组件为单元格指定的属性。您无需实现这些属性。
|
属性 |
说明 |
|---|---|
|
指向包含单元格的 List 组件的引用。 |
|
|
指向包含单元格的行的引用。 |
|
|
|
|