使用AS3.0在flash中更改datagrid上的标题。更改选取框的Datagrid单元格中的内容
大家好,各位编剧 我一直在尝试自定义datagrid组件。到目前为止,我已经能够使用自定义cellRenderer自定义单元格。我想通过使用自定义headerRenderer来改变标题的外观,但是我尝试过的所有标题都不起作用 这是我当前的headerRenderer代码使用AS3.0在flash中更改datagrid上的标题。更改选取框的Datagrid单元格中的内容,flash,actionscript-3,datagrid,marquee,Flash,Actionscript 3,Datagrid,Marquee,大家好,各位编剧 我一直在尝试自定义datagrid组件。到目前为止,我已经能够使用自定义cellRenderer自定义单元格。我想通过使用自定义headerRenderer来改变标题的外观,但是我尝试过的所有标题都不起作用 这是我当前的headerRenderer代码 package { import fl.controls.dataGridClasses.HeaderRenderer; import flash.text.TextFormat; import f
package {
import fl.controls.dataGridClasses.HeaderRenderer;
import flash.text.TextFormat;
import flash.filters.BevelFilter;
import flash.text.TextField;
import flash.display.Sprite;
public class PlayListHeaderRenderer extends HeaderRenderer {
public function PlayListHeaderRenderer() {
var format:TextFormat = new TextFormat("Arial", 12);
format.color = 0xffff00;
format.bold = true;
var upSkinBg:Sprite = new Sprite();
upSkinBg.graphics.lineStyle(0.1,0x999999);
upSkinBg.graphics.beginFill(0x666666);
upSkinBg.graphics.drawRect(0,0,10,10);
upSkinBg.graphics.endFill();
var downSkinBg:Sprite = new Sprite();
downSkinBg.graphics.lineStyle(0.1,0x999999);
downSkinBg.graphics.beginFill(0x0000cc);
downSkinBg.graphics.drawRect(0,0,10,10);
downSkinBg.graphics.endFill();
var overSkinBg:Sprite = new Sprite();
overSkinBg.graphics.lineStyle(0.1,0x999999);
overSkinBg.graphics.beginFill(0x0000ff);
overSkinBg.graphics.drawRect(0,0,10,10);
overSkinBg.graphics.endFill();
var selectedUpSkinBg:Sprite = new Sprite();
selectedUpSkinBg.graphics.lineStyle(0.1,0x999999);
selectedUpSkinBg.graphics.beginFill(0x0000cc);
selectedUpSkinBg.graphics.drawRect(0,0,10,10);
selectedUpSkinBg.graphics.endFill();
var selectedDownSkinBg:Sprite = new Sprite();
selectedDownSkinBg.graphics.lineStyle(0.1,0x999999);
selectedDownSkinBg.graphics.beginFill(0x0000cc);
selectedDownSkinBg.graphics.drawRect(0,0,10,10);
selectedDownSkinBg.graphics.endFill();
var selectedOverSkinBg:Sprite = new Sprite();
selectedOverSkinBg.graphics.lineStyle(0.1,0x999999);
selectedOverSkinBg.graphics.beginFill(0x0000ff);
selectedOverSkinBg.graphics.drawRect(0,0,10,10);
selectedOverSkinBg.graphics.endFill();
setStyle("textFormat", format);
setStyle("upSkin", upSkinBg);
setStyle("downSkin", downSkinBg);
setStyle("overSkin", overSkinBg);
setStyle("selectedUpSkin", selectedUpSkinBg);
setStyle("selectedDownSkin", selectedDownSkinBg);
setStyle("selectedOverSkin", selectedOverSkinBg);
}
}
}
在我的实际计划中,我做了如下工作:
dgPL.setStyle("headerRenderer", PlayListHeaderRenderer);
尝试将我创建的headerRenderer类设置为datagrid名称dgPL。但它不起作用。从我在互联网上发现的情况来看,headerRenderer类在设计和实现中的作用与cellRenderer类类似。我找不到任何使用自定义headerRenderer类的示例,也找不到如何创建自定义headerRenderer类的示例。因此,如果能让我知道我在设计我的课程或在我的程序中实施课程时哪里出了问题,我将不胜感激
此外,我还试图找出如何向同一datagrid的单元格中添加字幕,以便在用户滚动datagids内容列表时,如果单元格中的内容对于单元格的大小来说太长,它将在单元格中滚动。我遇到的问题是,如何在不永久覆盖datagrid中该特定行的dataprovider内容的情况下获得分配给单元格的新字符串
通过我在互联网上的搜索,我找到了一种为文本字段创建字幕的方法。我不明白的是如何将其应用于数据网格本身
字幕的代码如下所示:
var tf:TextField = new TextField();
tf.defaultTextFormat = dtf;
tf.text = dgPL.getItemAt(evt.rowIndex.toString()).Artist + " ";
tf.x = tf.y = 300;
addChild(tf);
var t:Timer = new Timer(200);
t.addEventListener(
TimerEvent.TIMER,
function(ev:TimerEvent): void
{
tf.text = tf.text.substr(1) + tf.text.charAt(0);
}
);
t.start();
现在,字幕通过创建一个文本字段并以这种方式制作字幕来工作,但这并不是最有效的方式,因为在数据网格中滚动内容时会出现allignment问题
我知道字幕是如何工作的,只是不知道如何将字幕应用到datagrid单元格本身。我知道如何在没有任何问题的情况下获取单元格的内容,以及如何重新定义它以使字幕正常工作。我只是不知道如何在不永久覆盖数据提供程序的情况下将其分配回单元格本身
如果您能在上述任何一个主题上提供帮助,我们将不胜感激
真诚地,
蒂姆回答你的第一个问题。您需要使用类而不是实例作为setStyle的参数。因此,您需要基于Sprite创建4个类,并在setStyle中传递它们 至于你的文本滚动问题,我建议这样一个小班:
package {
import fl.controls.listClasses.CellRenderer;
import flash.events.MouseEvent;
import flash.events.Event;
public class ScrolledDataGridCell extends CellRenderer{
private var mOver:Boolean=false;
private var active:Boolean=false;
public function ScrolledDataGridCell() {
addEventListener(MouseEvent.ROLL_OVER,over);
addEventListener(MouseEvent.ROLL_OUT,out);
}
private function over(e:Event):void{
mOver=true;
if(!active&&textField.maxScrollH>0){
active=true;
addEventListener(Event.ENTER_FRAME,frame);
}
}
private function out(e:Event):void{
mOver=false
}
private function frame(e:Event):void{
if(mOver){
textField.scrollH++;
}else{
if(textField.scrollH>0){
textField.scrollH--;
}else{
if(active){
active=false;
removeEventListener(Event.ENTER_FRAME,frame);
}
}
}
}
}
}