2009-01-23 145 views
1

我无法从我的动作中控制滚动窗格的滚动(我使用ActionScript 3.0)滚动窗格设置滚动位置

这里是我的定义:

var scrollPane:ScrollPane = new ScrollPane(); 
scrollPane.verticalScrollPolicy = "false"; 
scrollPane.move(374, 0); 
scrollPane.setSize(476, 370); 

当我尝试设置它 - scrollPane.horizo​​ntalScrollPosition = 500;我收到以下错误

TypeError: Error #1009: Cannot access a property or method of a null object reference. 
    at fl.containers::ScrollPane/setScrollDrag() 
    at fl.containers::ScrollPane/draw() 
    at fl.core::UIComponent/drawNow() 
    at fl.containers::BaseScrollPane/set horizontalScrollPosition() 
    at Program() 
    at Preloader/main() 
    at Preloader/enterFrameHandler() 

即使scrollPane.horizo​​ntalScrollPosition = scrollPane.horizo​​ntalScrollPosition;抛出相同的错误。

但是trace(scrollPane.horizo​​ntalScrollPosition);工作得很好。

我也尝试过hPosition,它根本不起作用。任何线索,我怎样才能控制滚动位置将不胜感激。

下面是整个代码

package { 
    import flash.display.*; 
    import flash.events.*; 
    import flash.filters.*; 
    import fl.transitions.Tween; 
    import fl.transitions.easing.*; 
    import fl.containers.ScrollPane; 


    public class Program extends Sprite { 
     public function Program() { 
      //define variable 
      var startX:Number; 
      var startY:Number; 
      var counter:Number = 0; 
      const LIMIT:Number = 100; 
      var intMessages:Number = 80; 
      var intBoardSize:Number = 476*(Math.round(intMessages/15)+1); 
      var intMessageMinX:Number = 35; 
      var intMessageMaxX:Number = intBoardSize-99; 
      var intMessageMinY:Number = 35; 
      var intMessageMaxY:Number = 310; 
      var activeGloveName:String = "" 
      var intDegreeHigh:Number = 45; 
      var intDegreeLow:Number = -45; 

      //create objects 
      var mcglove:mcGlove = new mcGlove(); 
      var mcglovetarget:mcGloveTarget = new mcGloveTarget(); 
      var myDropShadowFilterSmall = new DropShadowFilter (2,45,0x000000,0.65,3,3,2,3,false,false,false); 
      var myDropShadowFilterDown = new DropShadowFilter (3,45,0x000000,0.65,5,5,2,3,false,false,false); 
      var myDropShadowFilterUp = new DropShadowFilter (5,45,0x000000,0.65,7,7,2,3,false,false,false); 
      var topShadow = new DropShadowFilter (3,90,0x000000,0.35,8,8,2,3,false,false,false); 
      var holder:MovieClip = new MovieClip(); 
      var pinkline:Sprite = new Sprite(); 
      var searchBox:Sprite = new Sprite(); 
      var topShadowBox:Sprite = new Sprite(); 
      var aMessages:Array = new Array(); 


      //Create a glove for each message 
      for (var x = 0; x < intMessages; x++){ 
       aMessages[x] = new mcGlove(); 
       aMessages[x].scaleX = .28; 
       aMessages[x].scaleY = .28; 
       counter = 0; 
       position(aMessages[x]); 
       aMessages[x].rotation = (0, 0, 0, Math.round(Math.random() * (intDegreeHigh - intDegreeLow)) + intDegreeLow); 
       aMessages[x].filters = [myDropShadowFilterSmall]; 
       holder.addChild(aMessages[x]); 
       aMessages[x].name = "glove" + x; 
       aMessages[x].addEventListener(MouseEvent.MOUSE_DOWN, selectMessage); 
       aMessages[x].addEventListener(MouseEvent.MOUSE_UP, releaseMessage); 
       aMessages[x].buttonMode = true; 
      } 

      var scrollPane:ScrollPane = new ScrollPane(); 
      scrollPane.verticalScrollPolicy = "false"; 
      scrollPane.move(374, 0); 
      scrollPane.setSize(476, 370); 
      scrollPane.horizontalLineScrollSize = 120; 


      topShadowBox.graphics.beginFill(0x333333); 
      topShadowBox.graphics.drawRect(0,0,870,5); 
      topShadowBox.x = -10; 
      topShadowBox.y = -5; 
      topShadowBox.filters = [topShadow]; 

      pinkline.graphics.beginFill(0xDB9195); 
      pinkline.graphics.drawRect(0,0,476,2); 
      pinkline.x = 374; 
      pinkline.y = 353; 

      searchBox.graphics.beginFill(0xDB9195); 
      searchBox.graphics.drawRect(0,0,476,25); 
      searchBox.x = 374; 
      searchBox.y = 370; 

      //add to frame 
      sortObjects(); 

      scrollPane.source = holder; 

      scrollPane.horizontalScrollPosition = 5; 

      //create instance names for referancing/compairing objects 
      mcglove.name = "mcglove"; 
      mcglovetarget.name = "mcglovetarget"; 

      //position the glove and modify apperiance 
      mcglove.x = 163; 
      mcglove.y = 211; 
      mcglove.filters = [myDropShadowFilterDown]; 
      mcglovetarget.x = 615; 
      mcglovetarget.y = 211; 
      mcglovetarget.alpha = 0 

      //action listeners 
      mcglove.addEventListener(MouseEvent.MOUSE_DOWN, selectGlove); 
      mcglove.addEventListener(MouseEvent.MOUSE_UP, releaseGlove); 

      function position(target) { 
       target.x = Math.round(Math.random() * (intMessageMaxX - intMessageMinX)) + intMessageMinX; 
       target.y = Math.round(Math.random() * (intMessageMaxY - intMessageMinY)) + intMessageMinY; 
       for (var i:uint=0; i<aMessages.length -1 ; i++) { 
        if(target.hitTestObject(aMessages[i]) && counter < LIMIT){ 
         counter++; 
         position(target); 
         return false; 
        }; 
       } 
      } 

      function selectGlove(event:MouseEvent):void { 
       event.target.startDrag(true); 
       var myTargetName:String = event.target.name + "target"; 
       var myTarget:DisplayObject = getChildByName(myTargetName); 
       mcglove.filters = [myDropShadowFilterUp]; 
       addChild(myTarget); 
       event.target.parent.addChild(event.target); 
       addChild(topShadowBox); 
       myTarget.alpha = .5; 
       startX = event.target.x; 
       startY = event.target.y; 
      } 

      function releaseGlove(event:MouseEvent):void { 
       event.target.stopDrag(); 
       var myTargetName:String = event.target.name + "target"; 
       var myTarget:DisplayObject = getChildByName(myTargetName); 
       event.target.filters = [myDropShadowFilterDown]; 
       myTarget.alpha = 0; 

       if (event.target.dropTarget != null && event.target.dropTarget.parent == myTarget){ 
        event.target.removeEventListener(MouseEvent.MOUSE_DOWN, selectGlove); 
        event.target.removeEventListener(MouseEvent.MOUSE_UP, releaseGlove); 
        event.target.x = myTarget.x; 
        event.target.y = myTarget.y; 
        var myTween:Tween = new Tween(getChildByName(event.target.name), "scaleX",Strong.easeOut,getChildByName(event.target.name).scaleX,.28,2,true); 
        var myTween2:Tween = new Tween(getChildByName(event.target.name), "scaleY",Strong.easeOut,getChildByName(event.target.name).scaleY,.28,2,true); 
        holder.addChild(getChildByName(event.target.name)); 
        scrollPane.source = holder; 
        holder.getChildByName(event.target.name).x=Math.round(Math.random() * (470+Math.round(scrollPane.horizontalScrollPosition) - Math.round(scrollPane.horizontalScrollPosition))) + Math.round(scrollPane.horizontalScrollPosition); 
        holder.getChildByName(event.target.name).y=Math.round(Math.random() * (intMessageMaxY - intMessageMinY)) + intMessageMinY; 
        holder.getChildByName(event.target.name).addEventListener(MouseEvent.MOUSE_DOWN, selectMessage); 
        holder.getChildByName(event.target.name).addEventListener(MouseEvent.MOUSE_UP, releaseMessage); 
       } else { 
        event.target.x = startX; 
        event.target.y = startY; 
       } 

       //sortObjects(); 
       addChild(scrollPane); 
       addChild(pinkline); 
       addChild(topShadowBox); 
      } 

      function selectMessage(event:MouseEvent):void{ 
       if (activeGloveName != ""){ 
        var activeGlove:DisplayObject = holder.getChildByName(activeGloveName); 
        activeGlove.filters = [myDropShadowFilterSmall]; 
        activeGlove.scaleX = .28; 
        activeGlove.scaleY = .28; 


       holder.addChild(activeGlove); 
       } 
       activeGloveName = event.target.name; 
       //event.target.dragIt(); 
       holder.addChild(holder.getChildByName(event.target.name)); 
       event.target.filters = [new GlowFilter(0xABEEFC, .65, 15, 15, 1, 1, false, false)]; 
       event.target.scaleX = .35; 
       event.target.scaleY = .35; 
      } 

      function releaseMessage(event:MouseEvent):void{ 
       event.target.dropIt(); 
      } 

      function sortObjects():void{ 
       addChild(mcglovetarget); 
       addChild(scrollPane); 
       addChild(pinkline); 
       addChild(searchBox); 
       addChild(mcglove); 
       addChild(topShadowBox); 
      } 

      mcglove.buttonMode = true; 

     } 
    } 
} 

回答

1

如果你看一下错误跟踪,如果你看看here错误是发生的

 
fl.containers::ScrollPane/setScrollDrag(). 

里面你会发现,scrollDrag ...

获取或设置一个值,该值指示是否当用户拖动滚动窗格中的内容时发生滚动。

你从来不把内容到滚动窗格

scrollPane.source = "...";

我相信这就是为什么错误的现象发生,尽量把一些内容放到滚动窗格您设置horizo​​ntalScrollPosition的面前。

+0

我发布了上面的完整代码。我确实有我刚才没有显示的内容。你可能仍然是对的,虽然如果内容没有在那个电话之前填充......我会更多地考虑,但我不认为它是这个问题。谢谢! – Patcouch22 2009-01-23 17:35:42

1

horizo​​ntalScrollPosition的是滚动窗格的特性,所以你将通过

scrollPane.horizo​​ntalScrollPosition = 500设置它;

而不是方法调用。

+0

好了,好了范围缩小...谢谢,我看看你现在是怎么做到的。 – Patcouch22 2009-01-23 17:37:02

0

您应该首先将ScrollPane添加到stage。如果scrollPane.stage == null你会有这样的错误。

2

我有同样的问题,并找出造成它的原因。至少在我的情况下,问题在于这个scrollpane还不是舞台上的一个孩子。

这会导致错误您所描述:

sp.verticalScrollPosition = 0;  
this.addChild(sp) 

虽然这工作得很好:

this.addChild(sp) 
sp.verticalScrollPosition = 0; 

希望它能帮助:)