0

各位编剧你好

我一直在尝试自定义数据网格组件。到目前为止,我已经能够使用自定义 cellRenderer 自定义单元格。我也想通过使用自定义 headerRenderer 来更改标题的外观,但是我尝试制作的所有标题都不起作用。

这是我当前的 headerRenderer 代码。

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 类设置为数据网格名称 dgPL。但它不起作用。从我在互联网上找到的内容来看,headerRenderer 类的行为与设计和实现中的 cellRenderer 类一样。我找不到任何使用自定义 headerRenderer 类的示例或有关如何制作的示例。因此,如果让我知道我在设计课程或将其实施到我的程序中出错的地方,将不胜感激。

此外,我正在尝试弄清楚如何将选取框添加到同一数据网格的单元格中,这样如果单元格中的内容对于单元格的大小来说太长,它将在用户滚动 datagids 列表时滚动穿过单元格的内容。我遇到问题的部分是弄清楚如何在不永久覆盖数据网格中该特定行的数据提供者内容的情况下将新字符串分配给单元格。

从我在互联网上的查看中,我找到了一种为 textFields 创建选取框的方法。我不知道如何将它应用于数据网格本身。

选框的代码如下:

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();

现在,选取框通过创建一个 textField 并以这种方式进行选取来工作,但由于滚动数据网格中的内容时的对齐问题,这根本不是最有效的方法。

我知道选取框是如何工作的,我只是不知道如何将此选取框应用于数据网格单元本身。我知道如何毫无问题地抓取单元格的内容以及如何重新定义它以使选取框正常工作我只是不确定如何在不永久覆盖数据提供者的情况下将其分配回单元格本身。

对于这些主题中的任何一个的任何帮助将不胜感激。

真诚的,蒂姆

4

1 回答 1

0

对于你的第一个问题。您需要使用类而不是实例作为 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);
                    }
                }
            }
        }
    }
}
于 2010-11-20T17:24:38.900 回答