重写属性
问题描述:
我有一个自定义按钮,一个文本框里面:因为我想这样做重写属性
package com.company.utils.ui
{
import flash.display.Shape;
import flash.display.Sprite;
import flash.text.TextField;
import flash.text.TextFieldAutoSize;
import flash.text.TextFormat;
public class CustomButton extends Sprite
{
public var label:TextField;
标签是公开的:
var playButton:CustomButton = new CustomButton();
playButton.label.embedFonts = true;
playButton.label.antiAliasType = AntiAliasType.ADVANCED;
playButton.label.sharpness = 1;
playButton.label.thickness = 25;
playButton.label.gridFitType = GridFitType.PIXEL;
playButton.label.defaultTextFormat = customTextFormat;
但我的问题是,我需要当我将文本分配给标签时,请做其他事情(调用私人customButton私有方法)。
playButton.label.text = "myText";
我该怎么做?
答
您可以创建自己的自定义TextField
类,然后覆盖text
属性,以便在分配值时可以合并一些额外的功能。然后在您CustomButton
类中,您的标签属性可以是该类定制TextField
类的一个实例。我提出了以下例子来说明这一点:
Main.as {文档类):
package
{
import com.flashdevelopprojects.display.CustomButton;
import flash.display.Sprite;
import flash.events.Event;
public class Main extends Sprite
{
public function Main():void
{
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);
var customButton:CustomButton = new CustomButton();
customButton.label.text = "supercalifragilisticexpialidocious";
trace(customButton.label.text); // supercalif...
}// end function
}// end class
}// end package
CustomButton.as:
package com.flashdevelopprojects.display
{
import com.flashdevelopprojects.text.CustomTextField;
import flash.display.Sprite;
public class CustomButton extends Sprite
{
public var label:CustomTextField;
public function CustomButton()
{
init();
}// end function
private function init():void
{
label = new CustomTextField();
}// end function
}// end class
}// end package
CustomTextField.as:
package com.flashdevelopprojects.text
{
import flash.text.TextField;
public class CustomTextField extends TextField
{
override public function get text():String { return super.text }
override public function set text(text:String):void { super.text = truncate(text) }
private function truncate(text:String):String
{
return (text.length > 10) ? text.substring(0, 10) + "..." : text;
}// end function
}// end class
}// end class
在此示例中,将字符串值分配给label
对象的text
属性时,t他调用私有方法truncate()
并解析该字符串值。如果字符串值的长度大于10,则返回被截断的原始字符串值的字符串。然后将截断的字符串分配给super.text
属性。
现在,当您跟踪label
对象的text
属性时,会得到截断的字符串而不是原始字符串。
答
最好不要直接暴露标签,而要为标签的属性创建getter/setter函数 - >Encapsulation。
伪代码:
CustomButton
{
private var label:TextField;
public function CustomButton()
{
label = new TextField();
}
public function setLabelSharpness(sharp:int):void
{
label.sharpness = sharp;
}
}
,你可以添加其他功能的setText(TXT:字符串),它设置标签的文本属性之前截断TXT。
public function setText(txt:String):void
{
_originalText = txt;
txt = (txt.length > 10) ? txt.substring(0, 10) + "..." : txt;
label.text = txt;
}
public function getText():String
{
return label.text;
}
public function getOriginalText():String
{
return _originalText;
}
是这样的.... 欢呼
请不要截断从我的答案复制'(txt.length> 10)? txt.substring(0,10)+“...”:txt'或至少提到它来自我的答案。 – Taurayi
sry,以为我把它从原始问题中复制过来。但对答案并不重要,只是一些代码来证明我的观点。 – pkyeck