#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;
}
}
}