0

我有一个“手工制作”按钮(_btn 作为实例名称),里面只有一个 dynamicText(或者我可以为四种按钮模式中的每一种说一个 dynaticText)。Up 模式的 dynamicText 的实例名称为“_text”。那么如果我正在处理包含按钮的movieClip 的AS,我该如何处理动态文本的文本呢?

package  {
import flash.display.MovieClip;
import flash.display.SimpleButton;

public class container extends MovieClip {
    var _btn:button;

    public function container() {
        _btn= new button;
        this.addChild(_btn);
        switch (_btn._text.text)
        {
            case "a": doAFunction();
            case "b": doBFunction();
            case "c": doCFunction();
        }

    }

}

}

我的代码有什么问题?

Access of possibly undefined property _text through a reference with static type flash.display:SimpleButton.
4

3 回答 3

1

当您在 Flash Professional 中创建按钮元件时,该元件将成为SimpleButton. 如果您想访问您在按钮符号中创建的显示对象,例如动态文本字段,您必须通过SimpleButton对象的upStateoverState和属性访问downState它。hitTestState

我创建了一个实用函数,您可以将其包含在您的项目中以获取动态文本字段。调用该函数getDTFFromSB()(从 simplebutton 获取动态文本字段)。

该函数接受参数simpleButtonstate。该simpleButton参数显然是针对有SimpleButton问题的对象,该state参数用于指定文本字段位于哪个状态属性( 、 和 ),并使用相应的字符串值:“up”、“over”、“down”和upState“ hit overState” .downStatehitTestState

该函数返回一个Object对象,该对象可以是TextField对象、Vector.<TextField对象或 null。

下面是实用函数 getDTFFromSB():

package utils
{
    import flash.display.DisplayObject;
    import flash.display.DisplayObjectContainer;
    import flash.display.SimpleButton;
    import flash.text.TextField;

    /**
     * get dynamic textfield from simple button
     */
    public function getDTFFromSB(simpleButton:SimpleButton, state:String = "up"):Object
    {
        var returnObject:Object;

        var displayObject:DisplayObject;

        switch(state)
        {
            case "up" : displayObject = simpleButton.upState;
            case "over" : displayObject = simpleButton.overState;
            case "down" : displayObject = simpleButton.downState;
            case "hit" : displayObject = simpleButton.hitTestState;

        }// end switch

        if(displayObject is TextField)
        {
            returnObject = displayObject;
        }
        else if(displayObject is DisplayObjectContainer)
        {
            var doc:DisplayObjectContainer = displayObject as DisplayObjectContainer;
            var textFields:Vector.<TextField> = new Vector.<TextField>();

            for(var i:uint = 0; i < doc.numChildren; i++)
            {
                if(doc.getChildAt(i) is TextField) 
                textFields.push(doc.getChildAt(i));

            }// end for

            if(textFields.length == 0) returnObject = null
            else if(textFields.length == 1) returnObject = textFields[0]
            else if(textFields.length > 1) returnObject = textFields;

        }
        else
        {
            returnObject = null;

        }// end else

        return returnObject;

    }// end function

}// end package

我还创建了一个使用示例。在库中,我有一个为 actionscript 导出的按钮符号。按钮符号有一个处于“up”状态的动态文本字段,其text属性值为“a”。这是文档类中的代码:

package
{
    import utils.getDTFFromSB;
    import flash.display.SimpleButton;
    import flash.display.Sprite;
    import flash.events.Event;
    import flash.text.TextField;

    public class Main extends Sprite
    {
        private var _myButton:SimpleButton;

        public function Main()
        {
            if(stage) init()
            else addEventListener(Event.ADDED_TO_STAGE, init);

        }// end function

        private function init(e:Event = null):void
        {
            removeEventListener(Event.ADDED_TO_STAGE, init);

            _myButton = new MyButton();
            addChild(_myButton);

            var returnedObject:Object = getDTFFromSB(_myButton);

            var textField:TextField;

            if(returnedObject is TextField)
            {
                textField = TextField(returnedObject);

            }
            else if(returnedObject is Vector.<TextField>)
            {
                textField = Vector.<TextField>(returnedObject)[0];

            }
            else if(returnedObject == null)
            {
                throw new Error("null value returned from getDTFFromSB() method");

            }// end if

            trace(textField.text) // ouput: a

        }// end function

    }// end class

}// end package

当我创建一个名为 的按钮符号的新实例时_myButton,我将其解析为getDTFFromSB()函数并将返回的对象存储在名为 的本地对象中returnedObject。然后我使用 if 语句来确定返回对象的类型,如果它是TextField对象, I store it in a localTextFieldobject. Now if I trace the文本property of theTextField` 对象,我得到“a”。

于 2011-07-26T09:54:10.310 回答
0

“按钮”在此脚本中未知 - 如果要创建标准按钮,请使用new Button()(大写 B)。

而且我认为 Button 没有文本属性,而是一个称为“标签”的属性。

尝试使用_btn.label.

于 2011-07-25T16:10:37.890 回答
0
package  {
  import flash.display.MovieClip;
  //import flash.display.SimpleButton;
  import fl.controls.Button

  public class container extends MovieClip {
    var _btn:button;
    public function container() {
      _btn= new button;
      this.addChild(_btn);
      switch (_btn.label)
      // switch (_btn._text.text)
      {
          case "a": doAFunction();
          case "b": doBFunction();
          case "c": doCFunction();
      }

    }

  }

}
于 2011-07-25T16:21:20.340 回答