在List组件中使用渲染器

发表于:2007-06-21来源:作者:点击数: 标签:
在网上看过很多人转载darronschall的LabelCellRenderer例子,其中有个错误,把myList.cellRenderer=LabelCellRenderer;这行代码放到了注释里面去了,但是到处转载的依然没有修正(其实原文是正确的)。其实看了这个我们并没有求甚解,要知道授人予鱼,不如授

   

  在网上看过很多人转载darronschall的LabelCellRenderer例子,其中有个错误,把myList.cellRenderer=LabelCellRenderer;这行代码放到了注释里面去了,但是到处转载的依然没有修正(其实原文是正确的)。其实看了这个我们并没有求甚解,要知道授人予鱼,不如授人予渔。

我们再来看下为什么通过cellrenderer可以给List、DataGrid、Tree和Menu 组件以及其它列表组件增强单元格内容显示。我们首先要从List组件开始分析,List类至关重要。DataGrid、Tree 和Menu 组件是 List类的扩展。List类由行构成。这些行显示滑过和选区突出显示,用作行选区的点击状态,并在滚动中扮演重要的角色。除了选区突出显示和图标(如节点图标和Tree组件的展开箭头)之外,行还包含一个单元格(或者,如果是DataGrid,则包含多个单元格)。在默认情况下,这些单元格是实现CellRenderer API 的 TextField对象。但是,您可以让 List使用不同的组件类作为每一行的单元格。唯一的要求是该类必须实现 List 用于与单元格通信的CellRenderer API。List类使用一种非常复杂的算法进行滚动。一个列表只会列出它一次能显示的最多行数,超出rowCount属性的值的项目根本不会获得行。在列表滚动时,它会将所有行上下移动(取决于滚动方向)。然后,列表将重复使用滚出视图的行;列表会重新初始化这些行,并使用它们作为正在滚入视图的新行,方法是将旧行的值设置为视图中的新行,然后将旧行移到新项目滚入视图的位置。要使用CellRendererAPI,您必须编写包含下面四个方法的类

  CellRenderer.getPreferredborder=1Height()返回单元格的首选高度

  CellRenderer.getPreferredWidth()返回单元格的首选宽度

  CellRenderer.setSize() 设置单元格的宽度和高度

  CellRenderer.setValue()设置要显示在单元格中的内容基于列表的组件将使用该类与单元格通信。这就是我们看到的darronschall定义的LabelCellRenderer类。系统将为单元格自动指定两个方法和一个属性

  CellRenderer.getCellIndex()返回包含单元格渲染器数据字段的名称的字符串

  CellRenderer.getDataLabel()返回包含两个字段(columnIndex和 rowIndex)的对象,这两个字段指明单元格的位置

  CellRenderer.listOwner指向包含单元格的列表的引用以便允许它与基于列表的组件通信。例如,假设单元格内包含一个复选框,该复选框导致行在单击时被选中。单元格渲染器需要引用包含它的基于列表的组件,以便调用基于列表的组件的selectedIndex属性。同时,单元格需要知道它当前正在渲染的项目索引,以便能够将 selectedIndex设置为正确的编号;单元格可以使用CellRenderer.listOwner 和CellRenderer.getCellIndex()达到此目的。您不需要实现这些API;在将单元格放到基于列表的组件内时,单元格将自动接收这些API。我们来看下LabelCellRenderer类实现的这几个方法代码:functioncreateChildren(Void): Void

  label = createObject(Label, label, 1,styleName:this,owner:this );

  label.html = true;

  size();// setSize is implemented by UIComponent and callssize(),after setting// __width and __border=1 Heightfunctionsize(Void) : Void

  label.setSize(__width, __border=1 Height);

  // make sure the label field is in the top-center corner

  // of the row

  label._x = 0;

  label._y = 0;function setValue(str:String,item:Object,sel:Boolean) : Void

  // hide the label if no data to display

  label._visible = (item!=undefined);

  // this line actually sets htmlText

  label.text = item.label;function getPreferredborder=1Height(Void) :Number

  // this is the border=1 Height with the default font, youmight

  // need to adjust this to suit your needs

  return 18;function getPreferredWidth(Void) : Number

  // default to the width of the listbox

  return__width;其中用来显示html标记的就是setValue方法了。我们定义了这个类后,剩下就是对List组件来设置新的单元格渲染器了。使用下面的代码:1://LabelCellRenderer就是指定单元格渲染的连接ID2 : myList.cellRenderer=LabelCellRenderer;也许看完这些,你可以做出更好效果的渲染器来。要注意的是,只有flashMX2004的List组件才支持。

  作者:Liu21st

原文转自:http://www.ltesting.net