Измените заголовки в сетке данных во флэш-памяти с помощью AS3.0. Изменить содержимое в ячейках Datagrid для бегущей строки

Здравствуйте, коллеги-скрипторы.

Я пытался настроить компонент datagrid. До сих пор мне удавалось настраивать ячейки с помощью пользовательского 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, или примеры того, как его создать. Поэтому любая помощь будет оценена, если я узнаю, где я ошибся при разработке своего класса или реализации его в моей программе.

Также я пытаюсь понять, как добавить Marquee в ячейки одной и той же сетки данных, чтобы, если содержимое в ячейке слишком длинное для размера ячейки, оно прокручивалось по ячейке, когда пользователь прокручивает список данных. содержания. Часть, с которой у меня возникли проблемы, - это выяснить, как получить новую строку, назначенную ячейке, без постоянного переопределения содержимого поставщика данных для этой конкретной строки в сетке данных.

Из моего поиска в Интернете я нашел способ создать шатер для текстовых полей. Чего я не могу понять, так это того, как применить его к самой сетке данных.

Код для бегущей строки выглядит следующим образом:

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

Прямо сейчас выделение работает путем создания текстового поля и выполнения выделения таким образом, но это не самый эффективный способ сделать это вообще из-за проблем с выравниванием при прокрутке содержимого в сетке данных.

Я знаю, как работает бегущая строка, я просто не понимаю, как применить эту бегущую строку к самим ячейкам сетки данных. Я знаю, как получить содержимое моей ячейки без каких-либо проблем и как переопределить его для работы бегущей строки. Я просто не уверен, как назначить его обратно самой ячейке, не переопределяя поставщика данных навсегда.

Любая помощь по любой из этих тем будет принята с благодарностью.

С уважением, Тим


person SDragon029    schedule 17.11.2010    source источник


Ответы (1)


Для вашей первой проблемы. Вам нужно использовать класс, а не экземпляр в качестве аргумента для setStyle. Итак, вам нужно сделать 4 класса на основе Sprite и передать их внутрь 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);
                    }
                }
            }
        }
    }
}
person wonderwhy-er    schedule 20.11.2010