Apache flex 从Flex 3.0升级到Flex 3.6-自定义组合框在super.commitProperties()中获取TypeError
我正在将Flex 3.0应用程序升级到Flex 3.6 SDK。该应用程序具有用于输入文本、组合框等的自定义控件。当我单击组合框时,调用super.commitProperties()时会出现异常。这在Flex3.0SDK中运行良好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()
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);
}