2010-11-17 75 views
0

你好同伴的腳本,使用AS3.0更改數據網格中的標題。更改Marquee的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); 

嘗試設置我創建到DataGrid名DGPL的的HeaderRenderer類。但它不起作用。從我在互聯網上找到的headerRenderer類的設計和實現中,我們假設其行爲與cellRenderer類相似。我無法找到使用自定義headerRenderer類的人的任何示例或有關如何創建它的示例。所以任何幫助將不勝感激,讓我知道我在設計我的課程或在我的程序中實施它出錯的地方,我將不勝感激。

另外我想弄清楚如何將Marquee添加到相同數據網格的單元格,以便如果單元格中的內容對於單元格的大小來說太長,它將在用戶滾動時滾動單元格通過內容的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(); 

眼下字幕作品通過創建一個文本框,做字幕這樣,但就是沒有做它在所有到期的最有效的方法滾動數據網格中的內容時分配問題。

我知道Marquee的工作原理,我只是沒有看到如何將這個選取框應用到datagrid單元格本身。我知道如何抓住我的單元格的內容而沒有任何問題,以及如何重新定義單元格的工作方式。我只是不確定如何將其分配回單元格本身,而不會永久覆蓋數據提供程序。

對這些主題的任何幫助將不勝感激。

真誠, 添

回答

0

對於你的第一個問題。您需要使用Class not instance作爲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); 
        } 
       } 
      } 
     } 
    } 
} 
相關問題