FLex3中弹出窗口包含TabNavigator时标签页的标题可能显示不完全的问题及解决方法

Application的代码如下

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Application xmlns:mx="http://www.adobe.com/2006/mxml" layout="absolute">  
  3.     <mx:Script>  
  4.         <!--[CDATA[  
  5.             import components.MyPanel;  
  6.             import mx.managers.PopUpManager;  
  7.               
  8.             private function openWin():void  
  9.             {  
  10.                 var win:MyPanel = new MyPanel();  
  11.                   
  12.                 PopUpManager.addPopUp(win, this, true)  
  13.                 PopUpManager.centerPopUp(win);  
  14.             }  
  15.         ]]-->  
  16.     </mx:Script>  
  17.     <mx:Button x="57" y="37" label="Open Window" click="openWin()"/>  
  18. </mx:Application>  

弹出窗口MyPanel的代码如下

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="400" height="300" fontSize="12">  
  3.     <mx:Script>  
  4.         <!--[CDATA[  
  5.             import mx.managers.PopUpManager;  
  6.         ]]-->  
  7.     </mx:Script>  
  8.     <mx:TabNavigator width="100%" height="100%" creationPolicy="all">  
  9.         <mx:Canvas label="基本信息" width="100%" height="100%">  
  10.             <mx:Button x="39" y="10" label="按钮"/>  
  11.         </mx:Canvas>  
  12.         <mx:Canvas label="基信本息" width="100%" height="100%">  
  13.             <mx:Label id="msgLbl" x="39" y="10" text="标签"/>  
  14.         </mx:Canvas>  
  15.     </mx:TabNavigator>  
  16.     <mx:ControlBar horizontalAlign="right">  
  17.         <mx:Button id="closeBtn" label="Close" click="PopUpManager.removePopUp(this)"/>  
  18.     </mx:ControlBar>  
  19. </mx:Panel>  

运行后发现第一个标签页的标题显示为“基本...”。

经跟踪后发现,Flex执行代码的顺序如下

[cpp]  view plain copy
  1. LayoutManager.doPhasedInstantiation()->LayoutManager.validateDisplayList()->UIComponent.validateDisplayList()->Tab.updateDisplayList()->Button.updateDisplayList()->Tab.layoutContents()->LayoutManager.validateDisplayList()->UIComponent.validateDisplayList()->Tab.updateDisplayList()->Button.updateDisplayList()->Button.layoutContents()->Tab.measureText()  

在Tab的measureText方法中,由于第一个标签页的样式名称为activeTabStyle,所以会调用UITextFormat.measureText()并最终调用UITextFormat.measure()来获取标题的宽度。在计算宽度时,执行语句

[javascript]  view plain copy
  1. measurementTextField = TextField(textFieldFactory.createTextField(fontModuleFactory));  

调用TextFieldFactory的createTextField方法来获取一个文本控件TextField,然后设置该文本控件的text并获取宽度。

TextFieldFactory的createTextField方法获取文本控件的方式似乎是获取最后一个创建的文本控件,如果tabNavigator的creationPolicy为auto,会获取到clostBtn的textField,如果tabNavigator的creationPolicy为all,则会获取到msgLbl的textField。由于标签页的标题默认是加粗显示,所以如果获取到的TextField的样式不是加粗(fontWeight != 'bold'),那么计算出来的宽度会小于实际的宽度,从而使显示出来的标题被截断。(在Flex中,Label默认不加粗,Button的文本默认加粗)

因此,问题的解决方法有3种:

1.增加样式activeTabStyle并设置字体不加粗。下面的代码为了统一标题的样式,也设置了TabNavigator的tabStyleName样式。

[xhtml]  view plain copy
  1. <?xml version="1.0" encoding="utf-8"?>  
  2. <mx:Panel xmlns:mx="http://www.adobe.com/2006/mxml" layout="vertical" width="400" height="300" fontSize="12">  
  3.     <mx:Style>  
  4.         .tabStyle, .activeTabStyle  
  5.         {  
  6.             font-weight:normal  
  7.         }  
  8.     </mx:Style>  
  9.     <mx:Script>  
  10.         <!--[CDATA[  
  11.             import mx.managers.PopUpManager;  
  12.         ]]-->  
  13.     </mx:Script>  
  14.     <mx:TabNavigator width="100%" height="100%" creationPolicy="all" tabStyleName="tabStyle">  
  15.         <mx:Canvas label="基本信息" width="100%" height="100%">  
  16.             <mx:Button x="39" y="10" label="按钮"/>  
  17.         </mx:Canvas>  
  18.         <mx:Canvas label="基信本息" width="100%" height="100%">  
  19.             <mx:Label id="msgLbl" x="39" y="10" text="标签"/>  
  20.         </mx:Canvas>  
  21.     </mx:TabNavigator>  
  22.     <mx:ControlBar horizontalAlign="right">  
  23.         <mx:Button id="closeBtn" label="Close" click="PopUpManager.removePopUp(this)"/>  
  24.     </mx:ControlBar>  
  25. </mx:Panel>  

2.保证最后一个文本控件的字体是加粗的。如以上的代码如果TabNavigator的creationPolicy是默认的auto,则由于closeBtn默认是加粗的,因此可以不设置。如果creationPolicy是all,则必须保证最后一页的最后一个控件的字体是加粗的,也可以放一个不显示的Label,如

[xhtml]  view plain copy
  1. <mx:Label includeInLayout="false" visible="false" text="隐藏的Label" fontWeight="bold"/>  

3.在第一个标签页的label后加一个空格,如

[xhtml]  view plain copy
  1. <mx:Canvas label="基本信息 " width="100%" height="100%">  

经试验,所需空格的数量标题的长度有关,当标题只有一个字时不用加空格,之后每增加4个字要加一个空格。

 

 

如果弹出窗口时不执行PopUpManager.centerPopUp(),或者不用弹出窗口、TabNavigator直接显示在Application中,此时TabNavigator显示出来后会再刷新一次从而显示正确的标题,因此不需做任何改动。

你可能感兴趣的:(JavaScript,XHTML,Flex,application,button,encoding)