Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/joomla/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 从Flex 3.0升级到Flex 3.6-自定义组合框在super.commitProperties()中获取TypeError_Apache Flex_Flex3 - Fatal编程技术网

Apache flex 从Flex 3.0升级到Flex 3.6-自定义组合框在super.commitProperties()中获取TypeError

Apache flex 从Flex 3.0升级到Flex 3.6-自定义组合框在super.commitProperties()中获取TypeError,apache-flex,flex3,Apache Flex,Flex3,我正在将Flex 3.0应用程序升级到Flex 3.6 SDK。该应用程序具有用于输入文本、组合框等的自定义控件。当我单击组合框时,调用super.commitProperties()时会出现异常。这在Flex3.0SDK中运行良好 TypeError: Error #1009: Cannot access a property or method of a null object reference. at mx.controls::ComboBox/destroyDropdown()

我正在将Flex 3.0应用程序升级到Flex 3.6 SDK。该应用程序具有用于输入文本、组合框等的自定义控件。当我单击组合框时,调用super.commitProperties()时会出现异常。这在Flex3.0SDK中运行良好

TypeError: Error #1009: Cannot access a property or method of a null object reference.
    at mx.controls::ComboBox/destroyDropdown()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBox.as:1681]
    at mx.controls::ComboBox/styleChanged()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBox.as:1177]
    at mx.core::UIComponent/setBorderColorForErrorString()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\core\UIComponent.as:5048]
    at mx.core::UIComponent/commitProperties()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\core\UIComponent.as:6033]
    at mx.controls::ComboBase/commitProperties()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBase.as:993]
    at mx.controls::ComboBox/commitProperties()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBox.as:1291]
    at com.hanover.utility.controls.autotestcontrols::AutotestComboBox/commitProperties()[C:\App\Control\PLCustomComboBox.as:59]
    at mx.core::UIComponent/validateProperties()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\core\UIComponent.as:5966]
    at mx.managers::LayoutManager/validateProperties()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:539]
    at mx.managers::LayoutManager/doPhasedInstantiation()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:689]
    at mx.managers::LayoutManager/validateNow()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\managers\LayoutManager.as:748]
    at mx.controls::ComboBox/displayDropdown()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBox.as:1638]
    at mx.controls::ComboBox/downArrowButton_buttonDownHandler()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBox.as:1796]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\core\UIComponent.as:9590]
    at mx.controls::Button/http://www.adobe.com/2006/flex/mx/internal::buttonPressed()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\Button.as:2504]
    at mx.controls::Button/mouseDownHandler()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\Button.as:2750]
    at flash.events::EventDispatcher/dispatchEventFunction()
    at flash.events::EventDispatcher/dispatchEvent()
    at mx.core::UIComponent/dispatchEvent()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\core\UIComponent.as:9590]
    at mx.controls::ComboBase/textInput_mouseEventHandler()[C:\autobuild\3.x\frameworks\projects\framework\src\mx\controls\ComboBase.as:1384]
PLCustomCombobox.as伪源,第59行如下所示

package com
{
    import com.name.utility.events.PLControlEvent;
    import com.name.utility.managers.ComboToolTipManager;

    import flash.events.Event;

    import mx.controls.ComboBox;
    import mx.events.FlexEvent;

    [Event(name="controlInitComplete", type="com.events.PLControlEvent")]

    [Event(name="plusControlValueChanged", type="com.name.utility.events.PLControlEvent")]

    public class PLControlComboBox extends ComboBox 
                                implements IPLControlControl
    {
        /**
         * A flag that indicates whether the control need to refresh.
         */     
        protected var isNeedRefresh:Boolean = false;

        /**
         * A flag that indicates whether the value of control is changed.
         */     
        protected var isValueChanged:Boolean = false;

        /**
         *  Constructor.
         */
        public function PLControlComboBox()
        {
            super();
            this.addEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
        }

        /**
         * @private
         * override commitProperties for avoid dispatch event many times.
         */     
        override protected function commitProperties():void
        {
            super.commitProperties(); // <---- line # 59 is here

            if(isNeedRefresh)
            {
                this.dispatchEvent(new PLControlEvent(PLControlEvent.VALUE_CHANGED));
                isNeedRefresh = false;
            }

            if(isValueChanged)
            {
                this.dispatchEvent(new Event("PLControlComboboxChanged"));
                isValueChanged = false;
            }
        }

        /**
         * Add item's tooltip.
         * @private
         */
        override public function set measuredWidth(value:Number):void
        {
            super.measuredWidth = value;
            if(collection && collection.length > 0)
            {
                ComboToolTipManager.showItemToolTip(this);
            }
        }
        protected function onCreationComplete(event:FlexEvent):void
        {
            this.removeEventListener(FlexEvent.CREATION_COMPLETE, onCreationComplete);
            this.dispatchEvent(new PLControlEvent(PLControlEvent.INIT_COMPLETE));
        }

        public function checkValidity():void
        {
            if(_required && dataProvider && dataProvider.length > 0 && _defaultItemIndex == selectedIndex)
            {
                _validity   = false;
                errorString = "please select one";
            }
            else
            {
                _validity   = true;
                errorString = "";
            }
        }

        // ======================================
        // public function
        // ======================================
        private function itemChanged():void
        {
            isNeedRefresh = true;
            isValueChanged = true;
            checkValidity();
        }

        // ======================================
        // properties
        // ======================================

        private var _required:Boolean       = false;
        private var _validity:Boolean       = false;
        private var _defaultItemIndex:int   = 0;

        public function get required():Boolean
        {
            return _required;
        }

        [Inspectable(defaultValue=false, category="Other")]
        public function set required(value:Boolean):void
        {
            _required       = value;
            isNeedRefresh   = true;
            checkValidity();
        }

        [Bindable("PLControlComboboxChanged")]
        public function get controlValue():Object
        {
            return this.selectedIndex;
        }

        public function set controlValue(value:Object):void
        {
            if(value is Number)
            {
                this.selectedIndex = int(value);
                itemChanged();
            }
        }

        /**
         * @copy IPLControlControl#validity
         */
        public function get validity():Boolean
        {
            return _validity;
        }

        /**
         * @copy IPLControlControl#type
         */
        public function get type():String
        {
            return PLControlTypeList.CONTROL_TYPE_COMBOBOX;
        }

        /**
         * If required is true, the default Item can not be selected.
         */
        public function get defaultItemIndex():int
        {
            return _defaultItemIndex;
        }

        [Inspectable(defaultValue=0, type="Number", category="Other")]
        public function set defaultItemIndex(index:int):void
        {
            _defaultItemIndex = index;
            isNeedRefresh   = true;
            checkValidity();
        }

        /**
         * Override for check validity.
         */
        override public function set selectedIndex(value:int):void
        {
            super.selectedIndex = value;
            itemChanged();
        }

        /**
         * Override for check validity.
         */
        override public function set selectedItem(value:Object):void
        {
            super.selectedItem = value;
            itemChanged();
        }
    }
}
package-com
{
导入com.name.utility.events.PLControlEvent;
导入com.name.utility.managers.ComboToolTimManager;
导入flash.events.Event;
导入mx.controls.ComboBox;
导入mx.events.FlexEvent;
[事件(name=“controlInitComplete”,type=“com.events.PLControlEvent”)]
[事件(name=“plusControlValueChanged”,type=“com.name.utility.events.PLControlEvent”)]
公共类PLControlComboBox扩展了ComboBox
实现IPLControlControl
{
/**
*指示控件是否需要刷新的标志。
*/     
受保护的变量isNeedRefresh:Boolean=false;
/**
*指示控件值是否更改的标志。
*/     
受保护的变量isValueChanged:Boolean=false;
/**
*构造器。
*/
公共函数PLControlComboBox()
{
超级();
此.addEventListener(FlexEvent.CREATION\u COMPLETE,onCreationComplete);
}
/**
*@私人
*多次重写避免分派事件的commitProperties。
*/     
重写受保护的函数commitProperties():void
{

super.commitProperties();//问题已在ApacheFlex4.10及更高版本中修复,请参阅

如果使用较旧的SDK,您可以像这样使用monkey-patch-mx:ComboBox添加“&&tween”复选框:


3.5中的ComboBox实现有很多更改。由于这些更改,我们不得不重新编写AutoComplete ComboBox组件。您可能需要重新编写自定义ComboBox扩展。但是,您没有向我们提供足够的信息来帮助您调试。我想我们需要查看您的扩展自定义ComboBox组件代码。我看一下PLCustomComboBox的第59行。谢谢Jeff。使用组件源代码更新。第59行是对super.commitProperties()的调用我想问一下,为什么您想从一个旧SDK升级到另一个?我必须承认,我已经多年没有接触过Flex 3了,所以我可能忽略了一些东西,但从我的立场来看,这似乎是一个毫无意义的操作。我们需要使用Flex 3.6功能(未处理的例外情况)这就是原因。我认为@RIAstar的意思是问;为什么不一直升级到Flex 4.6或Apache Flex 4.8?不幸的是,super.commitProperties可能是代码中触发错误的那一行;但它肯定不能帮助我们猜测原因。:-(谢谢,我们将尝试一下。链接到更改的文件-
private function destroyDropdown():void
    {
        if (inTween)
            tween.endTween();//<---- exception on this line

        displayDropdown(false, null, false);
    }
private function destroyDropdown():void
{
    if (inTween && tween)
        tween.endTween();

    displayDropdown(false, null, false);
}