2011-08-06 108 views
0

我有一個自定義按鈕,一個文本框裏面:因爲我想這樣做重寫屬性

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"; 

我該怎麼做?

回答

1

您可以創建自己的自定義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屬性時,會得到截斷的字符串而不是原始字符串。

1

最好不要直接暴露標籤,而要爲標籤的屬性創建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; 
} 

是這樣的.... 歡呼

+0

請不要截斷從我的答案複製'(txt.length> 10)? txt.substring(0,10)+「...」:txt'或至少提到它來自我的答案。 – Taurayi

+0

sry,以爲我把它從原始問題中複製過來。但對答案並不重要,只是一些代碼來證明我的觀點。 – pkyeck