IUITextField 를 사용하자.

2011-08월 21일 어느날 ..
대체 이게 뭘 정리한거지????? -_- 1년이 지나고 보니 내가 쓴거지만 뭔 내용을 쓴건지 도통 모르겠다 ㅠㅠ





컴포넌트작성시 글씨를 표시해야 하는데 Label 를 사용하여 표시하려고 했지만..
왠지 더 가벼운 객체가 있을꺼 같아서 label 객체를 분석하였다.
Label 객체내부에서 텍스트 표시를 위해 사용되는 객체니깐 당연히 Label 보다 가볍다고 본다;;

다음은 Label에서 IUITextField를 사용하는 부분을 정리하였다.

override protected function createChildren():void
    {
        super.createChildren();

         if (!textField)
            createTextField(-1);
    }

textField 객체가 null 이면 생성.
  - createTextField(-1);
- textField가 add 되는 위치 설정값이다.


 override protected function commitProperties():void
    {
        super.commitProperties();        
        if (hasFontContextChanged() && textField != null)  1
        {
            removeTextField();
           
            condenseWhiteChanged = true;
            enabledChanged = true;
            selectableChanged = true;
            textChanged = true;
        }
        if (!textField)   2
            createTextField(-1);
    }

hasFontContextChanged()  뭔지 모르겠음...
1.  뭔가 바뀌면 삭제..(정확한건 모르겠음.)
- 삭제 했을때는 반드시 이벤트도 같이 삭제 한다.
2. 삭제 했을지 모르니 다시 생성.

override protected function updateDisplayList(unscaledWidth:Number,
                                                  unscaledHeight:Number):void
    {
        super.updateDisplayList(unscaledWidth, unscaledHeight);
        var paddingLeft:Number = getStyle("paddingLeft");
        var paddingTop:Number = getStyle("paddingTop");
        var paddingRight:Number = getStyle("paddingRight");
        var paddingBottom:Number = getStyle("paddingBottom");

       
        textField.setActualSize(unscaledWidth - paddingLeft - paddingRight,
                                unscaledHeight - paddingTop - paddingBottom);

        textField.x = paddingLeft;
        textField.y = paddingTop;

       var t:String = isHTML ? explicitHTMLText : text;

        var textFieldBounds:Rectangle = measureTextFieldBounds(t);
 
              if (truncateToFit)
        {
            var truncated:Boolean;
            if (isHTML)
            {
                truncated = textFieldBounds.width > textField.width;
            }
            else
            {
              
                textField.text = _text;
                             truncated = textField.truncateToFit();
            }

           if (!toolTipSet)
                super.toolTip = truncated ? text : null;
        }
       
    }




  mx_internal function createTextField(childIndex:int):void
    {  
        if (!textField)
        {
            textField = IUITextField(createInFontContext(UITextField));
            textField.enabled = enabled;
            textField.ignorePadding = true;
            textField.selectable = selectable;
            textField.styleName = this;
            textField.addEventListener("textFieldStyleChange",
                                       textField_textFieldStyleChangeHandler);
            textField.addEventListener("textInsert",
                                       textField_textModifiedHandler);                                      
            textField.addEventListener("textReplace",
                                       textField_textModifiedHandler);                    
                  
                                      
            if (childIndex == -1)
                addChild(DisplayObject(textField));
            else
                addChildAt(DisplayObject(textField), childIndex);
        }
    }

textField 생성부분

 textField = IUITextField(createInFontContext(UITextField));  왜 이렇게 생성하는지 모르겠음
- 생성시에 관련이벤트를 등록
- DisplayObject 객체로 변환해서 add를 해야 한다는 점 기억하자.


 

mx_internal function removeTextField():void
    {
        if (textField)
        {
            textField.removeEventListener("textFieldStyleChange",
                                          textField_textFieldStyleChangeHandler);
            textField.removeEventListener("textInsert",
                                          textField_textModifiedHandler);                                      
            textField.removeEventListener("textReplace",
                                          textField_textModifiedHandler);                                      
            removeChild(DisplayObject(textField));
            textField = null;
        }
    }

객체를 삭제할때 이벤트 삭제와 해당 객체를 null 처리하고 있다. 
이런식의 자원관리는 필수임..


하고 보니 거의 Label 소스분석이 되어 버렸다 -_-..

'Flex / AIR / AS' 카테고리의 다른 글

DateFormatter 사용하기.  (0) 2009.08.17
[AS3.0] 각 달의 마지막 날짜 구하기  (0) 2009.08.11
ResourceBundle 사용하기.  (0) 2009.06.18
[Flex3.0] Box로 구현한 Drag and Drop  (0) 2009.06.11
Point 클래스  (0) 2009.06.02