还有一个头痛很久的鼠标触发问题,后来发现可以用<textarea cols="50" rows="15" name="code" class="c-sharp"> myChart.showDataTips = false; myChart.showDataTips = true;</textarea>
来实现无鼠标下显示datatip,同时showDataTips="true"
<textarea cols="50" rows="15" name="code" class="java"><?xml version="1.0" encoding="utf-8"?> <mx:Canvas xmlns:mx="http://www.adobe.com/2006/mxml" xmlns:report="dps.component.report.*" xmlns:chart="dps.component.chart.*" creationComplete="init()" > <mx:Script> <!--[CDATA[ import mx.charts.events.ChartItemEvent; import mx.events.ListEvent; import dps.model.PaperJamResultBean; import dps.model.LocationEntityBean; import dps.model.ResponseTimeResultBean; import dps.model.ResponseTimeReportBean; import dps.core.util.DateUtil; import mx.charts.HitData; import dps.model.RoleEntityBean; import mx.events.DynamicEvent; import mx.collections.ArrayCollection; import mx.controls.Alert; import mx.charts.chartClasses.IAxis; import mx.utils.ObjectUtil; import dps.control.ReportControl; import dps.control.ManagementControl; [Bindable]public var printerAdmin:RoleEntityBean; [Bindable]public var printerAdminList:ArrayCollection; [Bindable]public var paList:ArrayCollection = new ArrayCollection(); public var loginUser:RoleEntityBean; [Bindable]private var responseAC:ArrayCollection = new ArrayCollection(); [Bindable]private var responseAC1:ArrayCollection = new ArrayCollection(); [Bindable] public var timeFrom:String; [Bindable] public var timeTo:String; [Bindable] public var tenantUID:String; [Bindable] public var userId:int; public var flag:Boolean=true; public function init():void { timeFrom = filterBar.lblfrom.text; timeTo = filterBar.lblto.text; tenantUID = "T1" loginUser = ReportModule.loginUser; filterBar.addEventListener("printerAdminSelected",printerAdminSelected); filterBar.addEventListener("PeriodFilter",periodClick); filterBar.addEventListener("SiteFilter",locationSelected); } public function getAdminList():void { ManagementControl.getInstance().getAllPrinterAdmin(ReportModule.loginUser.tenantUID,callback); function callback(admins:ArrayCollection,reset:Boolean = true):void { printerAdminList = admins; locatinFilter(filterBar.buildingSelector.selectedItem.displayName); } } public function getResponseTime():void { if(responseAC) { responseAC.removeAll(); } ReportControl.getInstance().getResponseTimeReport(timeFrom,timeTo,tenantUID,userId,callback); function callback(responseTimeReportBean:ResponseTimeReportBean):void { responseAC = responseTimeReportBean.resultList ; average.text = "Average :"+responseTimeReportBean.avgValue + "minutes "; } } public function printerAdminSelected(evt:DynamicEvent):void { printerAdmin = evt.data; tenantUID = "T1";//printerAdmin.tenantUID; userId = printerAdmin.id; responsePanel.title = "Printer Admin : "+ printerAdmin.employee.name; getResponseTime(); } public function locationSelected(evt:DynamicEvent):void { if(!flag) { locatinFilter(filterBar.buildingSelector.selectedItem.displayName); } if(flag) { getAdminList(); flag = false; } } private function locatinFilter(locationName:String):void { if(paList) { paList.removeAll(); } for(var i:int;i<printerAdminList.length;i++) { var padminSelected:RoleEntityBean = printerAdminList[i] as RoleEntityBean; for each(var o:LocationEntityBean in padminSelected.chargedLocations) { for each(var ob:LocationEntityBean in o.childLocations) { //Alert.show(ob.displayName); if(locationName==ob.displayName) { //Alert.show(padminSelected.employee.notesId); paList.addItem(padminSelected); } } } filterBar.printerAdminList = paList; } if(paList.length>0) { userId = paList[0].id; responsePanel.title = "Printer Admin : "+ paList[0].employee.name; getResponseTime(); } } private function linearAxis_labelFunc(item:Object, prevValue:Object, axis:IAxis):String { return item.toString(); } private function categoryAxis_labelFunc(item:Object, prevValue:Object, axis:CategoryAxis, categoryItem:Object):String { return null; } private function dataTipFunction(item:HitData):String { // return null return "Printer Name:"+item.chartItem.item.printer.name+"&#13;"+"&#13;"+"Paper Jam: "+DateUtil.toString(item.chartItem.item.updateTime)+"&#13;"+"&#13;"+"Ready: "+DateUtil.toString(item.chartItem.item.recoverTime)+"&#13;"+"&#13;"+"Response Time: "+item.chartItem.item.reponseTime+" Minutes"; } private function labelFunction(item:Object, column:DataGridColumn):String { if((item as ResponseTimeResultBean).updateTime!=null){ return DateUtil.toMinuteString((item as ResponseTimeResultBean).updateTime); }else{ return ""; } } private function labelFunction2(item:Object, column:DataGridColumn):String { if((item as ResponseTimeResultBean).recoverTime!=null){ return DateUtil.toMinuteString((item as ResponseTimeResultBean).recoverTime); }else{ return ""; } } public function periodClick(evt:DynamicEvent):void { timeFrom = evt.timeFrom; timeTo = evt.timeTo; getResponseTime(); } public function sortCompareFunction(itemA:Object, itemB:Object):int { var dateA:String = itemA.printer.name; var dateB:String = itemB.printer.name; return ObjectUtil.stringCompare(dateA, dateB); } public function itemClick(event:ListEvent):void { /*var printer:PaperJamResultBean = dataGrid.selectedItem as PaperJamResultBean; Alert.show(printer.printerUid); /*var dymEvent:DynamicEvent = new DynamicEvent("selectPrinter"); dymEvent.data = printer; dispatchEvent(dymEvent);*/ /*trace("lblhour"+lblhour.x); trace("myChart"+myChart.x);*/ myChart.k = event.rowIndex; myChart.showDataTips = false; myChart.showDataTips = true; } public function myHandler(e:ChartItemEvent):void { trace(e); Alert.show("Chart data was clicked"); } ]]--> </mx:Script> <mx:Panel width="100%" height="100%" headerHeight="35" title="Response Time"> <mx:HBox width="100%" height="100%"> <mx:VBox width="35%" height="100%"> <mx:DataGrid dataProvider="{responseAC}" id="dataGrid" width="100%" height="100%" itemClick="itemClick(event)"> <mx:columns> <mx:DataGridColumn headerText="Printer Name" sortCompareFunction="sortCompareFunction"> <mx:itemRenderer> <mx:Component> <mx:Label text="{data.printer.name}"/> </mx:Component> </mx:itemRenderer> </mx:DataGridColumn> <mx:DataGridColumn headerText="Paper Jam" labelFunction="labelFunction" sortable="false"> </mx:DataGridColumn> <mx:DataGridColumn headerText="Reday" labelFunction="labelFunction2" sortable="false"> </mx:DataGridColumn> <mx:DataGridColumn headerText="Response Time" dataField="reponseTime"> </mx:DataGridColumn> </mx:columns> </mx:DataGrid> </mx:VBox> <mx:Panel height="100%" width="65%" layout="absolute" headerHeight="0"> <mx:Panel height="100%" width="100%" title="Response Time" id="responsePanel"> <mx:HBox width="100%"> <mx:Label id="lblhour" text=" Hour(s)" fontWeight="bold"/> <mx:Spacer width="100%"/> <mx:Label id="average" fontWeight="bold"/> </mx:HBox> <!--<mx:ColumnChart id="column" height="100%" width="100%" paddingLeft="5" paddingRight="5" color="0x323232" showDataTips="true" dataProvider="{responseAC}" dataTipFunction="dataTipFunction" maxColumnWidth="10" itemClick="myHandler(event)"> <mx:verticalAxis> <mx:LinearAxis labelFunction="linearAxis_labelFunc" /> </mx:verticalAxis> <mx:horizontalAxis> <mx:CategoryAxis categoryField="printerUID" labelFunction="categoryAxis_labelFunc"/> </mx:horizontalAxis> <mx:series> <mx:ColumnSeries yField="reponseTime" displayName="paper jam times" width="0.1"/> </mx:series> <mx:secondVerticalAxis> <mx:LinearAxis/> </mx:secondVerticalAxis> <mx:secondSeries> <mx:LineSeries yField="av" dataProvider="{responseAC}"/> </mx:secondSeries> </mx:ColumnChart> --> <mx:VBox width="100%" height="100%"> <chart:MyColumnChart width="100%" height="100%" id="myChart" dataProvider="{responseAC}" showDataTips="true" dataTipFunction="dataTipFunction"> <chart:series> <chart:MyColumnSeries id="xuhua" yField="reponseTime" /> </chart:series> <chart:horizontalAxis> <mx:CategoryAxis categoryField="printerUID" labelFunction="categoryAxis_labelFunc"/> </chart:horizontalAxis> </chart:MyColumnChart> </mx:VBox> </mx:Panel> </mx:Panel> </mx:HBox> </mx:Panel> <report:FilterResponse id="filterBar" width="100%" cornerRadius="5" borderStyle="solid" /> </mx:Canvas> </textarea>
有一个Bug就是由于包含父容器,x,y坐标都不正确,原本打算用var pt:Point = localToGlobal (new Point(items[k].x,items[k].y));发现效果很差
我是在硬代码中微调的,可能留下隐患
var pt:Point = new Point(items[k].x+50,items[k].y+10);
这样就初步实现了联动