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 クラスを使用している人々の例や、その作成方法の例が見つかりません。そのため、クラスの設計やプログラムへの実装でどこが間違っているかを教えていただければ幸いです。

また、同じデータグリッドのセルにマーキーを追加して、セルのコンテンツがセルのサイズに対して長すぎる場合、ユーザーがデータグリッドリストをロールオーバーしたときにセルをスクロールする方法を見つけようとしています。コンテンツの。私が問題を抱えているのは、データグリッド内の特定の行のデータプロバイダーのコンテンツを永久にオーバーライドせずに、新しい文字列をセルに割り当てる方法を考え出すことです。

インターネットで調べた結果、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 に答える