прошить простую кнопку текстом

#flash #actionscript-3

#flash #actionscript-3

Вопрос:

У меня есть простая кнопка во Flash cs5 — as3 под названием btn1 с динамическим текстом под названием text_txt внутри нее.

Однако цель состоит в том, чтобы просто изменить текст…

 btn1.visible=true; // works fine
this.btn1.text_txt.text="hello"; // give a NULL error
  

Мой вопрос: как программно изменить текст, который находится внутри этой кнопки?

Комментарии:

1. Какой класс btn1 расширяется? SimpleButton ? MovieClip ? Sprite ? Я знаю, вы говорите, что у вас есть «простая кнопка», но ответ зависит от того, к какому классу она распространяется. Также вы создавали btn1 программно или вручную?

Ответ №1:

Поскольку у меня есть FlashDevelop, я могу только показать вам, как все делать программно.

Если вы имеете дело с Sprite объектом (что я рекомендую), то следующим образом вы получаете доступ к TextField в Sprite объекте:

 var textField:TextField = new TextField();
textField.name = "textField";
textField.mouseEnabled = false;

var rectangleShape:Shape = new Shape();
rectangleShape.graphics.beginFill(0xFF0000);
rectangleShape.graphics.drawRect(0, 0, 100, 25);
rectangleShape.graphics.endFill();

var buttonSprite:Sprite = new Sprite();
buttonSprite.addChild(rectangleShape);
buttonSprite.addChild(textField);
addChild(buttonSprite);

var tf:TextField = TextField(buttonSprite.getChildByName("textField"));
tf.text = "button sprite text";
  

Сначала создается экземпляр вызываемого TextField объекта textField , и его name свойству присваивается строка «TextField», которая совпадает с настройкой имени его экземпляра.

Затем создается экземпляр Shape вызываемого rectangleShape объекта, который графически сконфигурирован так, чтобы выглядеть как простой красный прямоугольник.

Затем создается экземпляр вызываемого Sprite объекта buttonSprite display object, к которому добавляются объекты textField и rectangleShape display objects. Затем на сцену добавляется Sprite контейнер отображаемых объектов.

Наконец, вызывается метод buttonSprite контейнера объектов getChildByName() отображения и возвращает textField объект отображения. Для этого в качестве аргумента textField методов должно быть указано свойство имени getChildByName() отображаемого объекта. Затем возвращенный textField объект сохраняется в локальном TextField объекте с именем tf , который теперь предоставляет вам доступ к textField .

[ОБНОВИТЬ]

Ниже приведен подход к доступу к TextField объекту через SimpleButton object, который аналогичен доступу к нему через Sprite object (хотя я не рекомендую это):

 var textField:TextField = new TextField();
textField.name = "textField";
textField.mouseEnabled = false;

var rectangleShape:Shape = new Shape();
rectangleShape.graphics.beginFill(0xFF0000);
rectangleShape.graphics.drawRect(0, 0, 100, 25);
rectangleShape.graphics.endFill();

var simpleButtonSprite:Sprite = new Sprite();
simpleButtonSprite.name = "simpleButtonSprite";
simpleButtonSprite.addChild(rectangleShape);
simpleButtonSprite.addChild(textField);

var simpleButton:SimpleButton = new SimpleButton();
simpleButton.upState = simpleButtonSprite;
simpleButton.overState = simpleButtonSprite;
simpleButton.downState = simpleButtonSprite;
simpleButton.hitTestState = simpleButtonSprite;
addChild(simpleButton);

// local simpleButtonSprite object
var sbs:DisplayObjectContainer = DisplayObjectContainer(simpleButton.upState);
//local textField object
var tf:TextField = TextField(sbs.getChildByName("textField"));  
tf.text = "simple button text ";
  

Ответ №2:

необходимо использовать базовый класс MovieClip btn1, в котором должно быть 3 кадра и text_txt — текстовое поле

 btn1.text_txt.text="blablabla"; // if MovieClip!!!
  

свойства кнопки у вас есть, что

 btn1.buttonMode = true;
btn1.addEventListener(MouseEvent.MOUSE_OVER, overListener);
btn1.addEventListener(MouseEvent.MOUSE_OUT, outListener);
btn1.addEventListener(MouseEvent.CLICK, clickListener);

function overListener(e:MouseEvent):void{
 e.currentTarget.gotoAndStop(1)
}
function outListener(e:MouseEvent):void{
 e.currentTarget.gotoAndStop(2)
}
function clickListener(e:MouseEvent):void{
 e.currentTarget.gotoAndStop(3)
}
  

Или вы можете создать MyBtnClass(_text:String,_MovieClip:MovieClip) то, что описано выше.
Извините за мой английский

Ответ №3:

Существует простой способ получить доступ к дочерним элементам SimpleButton:

Например, в моем SimpleButton (с именем _myButton) в рабочем состоянии у меня есть метка (имя ее экземпляра не имеет значения) и спрайт (на уровне 0):

var _container:DisplayObjectContainer = DisplayObjectContainer(_myButton.upState);
var _spt:Sprite = Sprite(_container.getChildAt(0));
var _lbl:Label = Label(_container.getChildAt(1));

Комментарии:
— Вы можете получить доступ к различным состояниям кнопки: upState, downState, hitTestState, overState;
— Вы можете выполнить приведение к DisplayObjectContainer, чтобы получить дочерние элементы;
— Вы не можете использовать (по крайней мере, напрямую) getChildByName, потому что имена экземпляров будут генерироваться динамически.

Ответ №4:

Добавьте этот класс к кнопке:

 usage example:
var my_btn_01 : SimpleButtonTf; //add you button instance name here 
write > my_btn_01.text = "ABC"
read  > trace(my_btn_01.text)  //output "ABC"    

package classes {
    import flash.display.Sprite;
    import flash.display.SimpleButton;
    import flash.display.DisplayObjectContainer;

    public class SimpleButtonTf extends SimpleButton {
        private var lbl_up:TextField;
        private var lbl_down:TextField;
        private var lbl_over:TextField;
        public function SimpleButtonTf(){

            //this.super();
            var _container_up:DisplayObjectContainer = DisplayObjectContainer(this.upState);
            var _container_down:DisplayObjectContainer = DisplayObjectContainer(this.downState);
            var _container_over:DisplayObjectContainer = DisplayObjectContainer(this.overState);
            lbl_up = _container_up.getChildAt(1) as TextField;
            lbl_down = _container_down.getChildAt(1) as TextField;
            lbl_over = _container_over.getChildAt(1) as TextField;
        }
        public function set text(str:String):void {

            lbl_up.text = str;
            lbl_down.text = str;
            lbl_over.text = str;
        }

        public function get text():String {

            return lbl_up.text;
        }
    }
}