主要是代码结构如下:
<mx:TabNavigator change="tabChanged(event)">
<s:NavigatorContent >
<mx:ColumnChart selectionMode="single" itemRollOverColor="green" showDataTips="true">
..... ......
<mx:ColumnChart >
</s:NavigatorContent >
</mx:TabNavigator>
---------------------------------------------------------------------------------------
tabChanged函数声明如下
public function tabChanged(event:IndexChangedEvent):void
{
}
TypeError: Error #1034: 强制转换类型失败:无法将 mx.charts.events::ChartItemEvent@5e19fa51 转换为 mx.events.IndexChangedEvent。
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.charts.chartClasses::ChartBase/http://www.adobe.com/2006/flex/mx/internal::selectItem()
at mx.charts.chartClasses::ChartBase/processRollEvents()
at mx.charts.chartClasses::ChartBase/mouseDownHandler()
at flash.events::EventDispatcher/dispatchEventFunction()
at flash.events::EventDispatcher/dispatchEvent()
at mx.core::UIComponent/dispatchEvent()
at mx.managers::SystemManager/mouseEventHandler()[E:\dev\4.y\frameworks\projects\framework\src\mx\managers\SystemManager.as:2918]
分析原因就是因为外面的容器(TabNavigator )已经监听了一个事件(IndexChangedEvent),所以里面的另一个组件(<mx:ColumnChart> selectionMode="single" )也会引起改变事件(ChartItemEvent),就是选择当前的柱状块,两者的事件类型是不一样,而且不能强制转换,所以报错了,查了一个Flex官网API:
Package | mx.events |
Class | public class IndexChangedEvent |
Inheritance | IndexChangedEvent Event Object |
Package | mx.charts.events |
Class | public class ChartItemEvent |
Inheritance | ChartItemEvent MouseEvent Event Object |
IndexChangedEvent主要是直接继承自Event,而ChartItemEvent继承自MouseEvent,然后再继承自Event,所以:可以考虑把函数中的IndexChangedEvent换成Event,把change="tabChanged(event)",换成tabIndexChange="tabChanged(event)"
public function tabChanged(event:Event):void
{
}
<mx:TabNavigator tabIndexchange="tabChanged(event)">
这样无论什么事件都能转型成Event,剩下的事情,让Flex API自己完成吧!!