Переопределяющие свойства публичного поля - PullRequest
0 голосов
/ 06 августа 2011

У меня есть пользовательская кнопка с текстовым полем внутри:

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

Как я могу это сделать?

Ответы [ 2 ]

1 голос
/ 06 августа 2011

было бы лучше не предоставлять метку напрямую, а создавать функции получения / установки для свойств метки -> Encapsulation .

псевдокод:

CustomButton
{
  private var label:TextField;

  public function CustomButton()
  {
     label = new TextField();
  }

  public function setLabelSharpness(sharp:int):void
  {
     label.sharpness = sharp;
  }
}

и вы можете добавить еще одну функцию для setText (txt: String), которая усекает txt перед установкой свойства text метки.

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

как то так .... веселит

1 голос
/ 06 августа 2011

Вы можете создать свой собственный пользовательский класс TextField, а затем переопределить свойство text, чтобы при назначении значения можно было объединить некоторые дополнительные функции.Тогда в вашем CustomButton классе ваше свойство label может быть экземпляром этого пользовательского 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 вызывается закрытый метод truncate(), который анализирует это строковое значение.Если длина строкового значения больше 10, то возвращается строка исходного строкового значения, которая усекается.Затем усеченная строка присваивается свойству super.text.

Теперь, когда вы отслеживаете свойство label объекта *1022*, вы получаете усеченную строку, а не исходную строку.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...