[原]Flex 编译资源引用 Bug

Flex 编译资源引用存在一个 Bug,就是只有在程序中声明组件,才会编译到结果文件中去。这种问题的现象就是,提示某某资源找不到。解决这种问题的办法是,声明一个该类型资源的变量(哪怕是一个空引用),就能够识别了。

这个问题比较隐蔽。

作者:bicaipiaohainanzhong 发表于2012-2-15 16:02:23 原文链接
阅读:150 评论:0 查看评论
]]>

[原]Flex Effect Using | Flex 效果使用

Flex中Effect的可以为程序增添特效,可以让程序更生动,下面的源码整理自Using Flex 4.6一书,将常用几种特效都演示一下:

EffectUsingExamples.mxml



    
        
    
    
        
    
        
        
            
        
        
            
        
        
            
            
        
        
            
            
        
        
        
        
    
    
        
        
    
        
            
            
        
        
            
            
        
        
        
        
        
        

    <s:Fade id="vsFade" alphaFrom="0" alphaTo="1" duration="1000"
            target="{vs}"/>

[原]Flex StringValidator with multiple input components | 多输入控件下验证器的使用

默认情况下as3并没有为我们提供可以应用于多组输入控件的验证器,因此对于包含大量输入,而且验证规则相同的应用程序来说,就需要通过其他途径来实现。下面说两种方法:

1.参考IBM的构建Flex自动验证框架

具体思想是构建一个控制器 (controller in MVC design pattern),让每一个被验证控件分发validate事件,让验证器依次处理。下面说我的方法。


2.自定义输入控件,为控件增加一个内置验证器,和一个外部提交按钮的引用,输入控件定义时,将提交按钮属性设置成想要指定的按钮即可。

RequiredTextInput.as文件定义如下:

package com.cachetian.examples.components
{
    import flash.events.EventPhase;
    import flash.events.MouseEvent;
    
    import mx.controls.Alert;
    import mx.events.FlexEvent;
    import mx.events.ValidationResultEvent;
    import mx.validators.StringValidator;
    import mx.validators.ValidationResult;
    
    import spark.components.Button;
    import spark.components.TextInput;
    
    /**
     * 
     * @author Cachetian
     * 
     */
    public class RequiredTextInput extends TextInput
    {
        public function RequiredTextInput()
        {
            super();
            //init the validator
            _stringValidatorRef.source = this;
            _stringValidatorRef.property = "text";
            _stringValidatorRef.required = true;
            _stringValidatorRef.addEventListener(ValidationResultEvent.VALID, validator_ValidationResultEventHandler);
            _stringValidatorRef.addEventListener(ValidationResultEvent.INVALID, validator_ValidationResultEventHandler);
        }
        // add a String validator reference
        private var _stringValidatorRef:StringValidator = new StringValidator();
        
        // add a submit button reference
        private var _submitButtonRef:Button = null;

        //
        //getter and setters
        //
        public function get submitButtonRef():Button
        {
            return _submitButtonRef;
        }

        /**
         * 
         */
        public function set submitButtonRef(value:Button):void
        {
            _submitButtonRef = value;
            if (_submitButtonRef)
            {
                //init the button
                _submitButtonRef.addEventListener(FlexEvent.UPDATE_COMPLETE, submitBtn_clickHandler);
            }
        }
        
        //
        //event handlers
        //
        private function submitBtn_clickHandler(event:FlexEvent):void
        {
            if (_stringValidatorRef.validate().type == ValidationResultEvent.INVALID)
            {
                event.stopImmediatePropagation();//在未输入的情况下,只提示第一个invalid的验证输入框
            }
        }
        
        public function validator_ValidationResultEventHandler(event:ValidationResultEvent):void
        {
            if (event.type == ValidationResultEvent.INVALID)
            {
                _submitButtonRef.enabled = false;
            }
            else //if (event.type == ValidationResultEvent.VALID)
            {
                _submitButtonRef.enabled = true;
            }
        }

    }
}

演示代码如下:


        

<fx:Declarations>
    <!-- Place non-visual elements (e.g., services, value objects) here -->
</fx:Declarations>
<s:Form>
    <s:FormHeading label="Multi Text Input Validation Example"/>
    <s:FormItem label="user name" required="true">
        <components:RequiredTextInput submitButtonRef="{submitBtn}"/>
    </s:FormItem>
    <s:FormItem label="user password" required="true">
        <components:RequiredTextInput submitButtonRef="{submitBtn}"/>
    </s:FormItem>
    <s:FormItem label="email address" required="true">
        <components:RequiredTextInput submitButtonRef="{submitBtn}"/>
    </s:FormItem>
    <s:FormItem>
        <s:Button id="submitBtn" label="submit" enabled="false" click="submitBtn_clickHandler(event)"/>
    </s:FormItem>
</s:Form></pre><br />

效果截图如下:


程序效果可以访问(这个不保证永久有效哦):

http://cachetian.com/blog/tech/flex/examples/MultiInputValidationExamples.html

        <div>
            作者:bicaipiaohainanzhong 发表于2012-2-14 11:40:06 <a href="http://blog.csdn.net/bicaipiaohainanzhong/article/details/7256903">原文链接</a>
        </div>
        <div>
        阅读:243 评论:0 <a href="http://blog.csdn.net/bicaipiaohainanzhong/article/details/7256903#comments" target="_blank">查看评论</a>
        </div>
    ]]>

[原]Java Constructor sequence discuss | Java构造函数顺序小记

Class的构造顺序可以从编译的角度去理解,突然想到一个非常好的例子来说明这个问题

package com.cachetian.scjp;

public class MyChildObj {
    public MyChildObj() {
        System.out.println("My Child Obj Constructes");
    }
}

package com.cachetian.scjp;

public class MyObj extends MyFatherObj{
    
    protected MyChildObj child = new MyChildObj();
    
    public MyObj() {
        System.out.println("My Obj Constructed");
    }
    
    public static void main(String[] args) {
        new MyObj();
    }
}
package com.cachetian.scjp;

public class MyFatherObj extends MyGrandFatherObj{
    
    public MyFatherObj() {
        System.out.println("My Father Obj Constructed");
    }
}
package com.cachetian.scjp;

public class MyUncleObj {
    public MyUncleObj() {
        System.out.println("My Uncle Constructed");
    }
}
package com.cachetian.scjp;

public class MyGrandFatherObj {
    
    protected MyUncleObj myUncle = new MyUncleObj();
    
    public MyGrandFatherObj() {
        System.out.println("My Grandfather Constructed");
    }
}
运行结果:
My Uncle Constructed
My Grandfather Constructed
My Father Obj Constructed
My Child Obj Constructes
My Obj Constructed

作者:bicaipiaohainanzhong 发表于2012-2-9 21:40:14 原文链接
阅读:284 评论:0 查看评论
]]>

[原]Flex Component instantiation life cycle | Flex组件实例化生命周期


使用一个组件,经常会寻找一个时机对组件进行操作,今天专门做了次实验

Flex代码很简单,自定义了一个组件,继承自Group的空间,名字叫InitSeqTracedMxmComponent.mxml



    
        
    
        
    

主函数直接调用它

结果如下:

控制台运行结果截图

首先是加压swf文件,这个没啥说的,忽略掉。

结果发现,最先执行的是preinitialize,注视里面说在这个event触发的时候,说有的子控件都还没有被创建。

然后是initialize,该方法在子控件被添加到自身的时候被触发。

其次出现了很多frameConstucted,这个事件是在帧被创建好的时候调用的,所谓帧,就是一副完整的画面,我觉得理解成框架最好,代表整个应用,但是帧是和时间关联的,按照一定的频率被更换,flex应用程序一般就2帧,第一帧加载,第二帧就是我们看到的这个应用程序。一般不会用,可以忽略掉。

再次后是creationComplete函数,在组件完全构建完成的时候调用。

最后是addToStage,被添加到舞台上时触发,也就是真正的被显示给用户的时机。

=========================第二次编辑=======2012.3.31==========================================

也许当初想看到这篇文章但是没有找到,今天故地重游,无意间看到这类话题的文章,欣喜或狂,记录下来。

下面这篇文章来自Adobe官方文档

About the component instantiation life cycle for MX components

The component instantiation life cycle describes the sequence of steps that occur when you create a component object from a component class. As part of that life cycle, Flex automatically calls component methods, dispatches events, and makes the component visible.

The following example creates a