在开发 Flex 项目时,有些画面上按钮比较多,需要根据不同的状态来显示不同的按钮,按钮的顺序也必须按规定设置,比如新建,编辑,删除,审核,打印这几个按钮,必须是先“新建”才能“编辑”,然后才能“审核”,所以说按钮的顺序代表着一定的业务流程。如果有两个不同权限的人进入画面,一个级别低,除了审核,其它操作都可做,而另外的一个人级别高,除了删除外,其它都能做。
要实现上面的功能,有两种方法:
方法一:根据不同的人设置一个状态,根据状态来判断该显示哪些按钮,不该显示哪些按钮。这种方法比较繁琐,需要自己设置按钮的坐标,如果设置不当,会出现按钮重叠或者按钮顺序不对等情况,代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx"
- creationComplete="application1_creationCompleteHandler(event)"
- >
- <fx:Script>
- <![CDATA[
- import mx.events.FlexEvent;
- private var flag:int;
- protected function application1_creationCompleteHandler(event:FlexEvent):void
- {
- flag = 0;
- resetBtn();
- }
- protected function btn_1_clickHandler(event:MouseEvent):void
- {
- flag = 1;
- resetBtn();
- }
- protected function btn_2_clickHandler(event:MouseEvent):void
- {
- flag = 2;
- resetBtn();
- }
- protected function btn_3_clickHandler(event:MouseEvent):void
- {
- flag = 0;
- resetBtn();
- }
- private function resetBtn():void {
- if (0 == flag) {//默认权限
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = true;
- checkBtn.visible = true;
- printBtn.visible = true;
- addBtn.right = 325;
- editBtn.right = 245;
- delBtn.right = 165;
- checkBtn.right = 85;
- }
- if (1 == flag) {//权限一
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = true;
- checkBtn.visible = false;
- printBtn.visible = true;
- addBtn.right = 245;
- editBtn.right = 165;
- delBtn.right = 85;
- }
- if (2 == flag) {//权限二
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = false;
- checkBtn.visible = true;
- printBtn.visible = true;
- addBtn.right = 245;
- editBtn.right = 165;
- }
- }
- ]]>
- </fx:Script>
- <fx:Declarations>
- <!-- 将非可视元素(例如服务、值对象)放在此处 -->
- </fx:Declarations>
- <s:Panel title="按钮的自动排列演示" top="100" left="300" width="500" height="200">
- <s:Button id="addBtn" top="5" right="325" label="添加" visible="false"/>
- <s:Button id="editBtn" top="5" right="245" label="编辑" visible="false"/>
- <s:Button id="delBtn" top="5" right="165" label="删除" visible="false"/>
- <s:Button id="checkBtn" top="5" right="85" label="审核" visible="false"/>
- <s:Button id="printBtn" top="5" right="5" label="打印" visible="false"/>
- <s:BorderContainer top="30" left="10" right="10" bottom="10">
- <s:Button id="btn_1" top="50" left="100" label="除了审核外" click="btn_1_clickHandler(event)"/>
- <s:Button id="btn_2" top="50" left="250" label="除了删除外" click="btn_2_clickHandler(event)"/>
- <s:Button id="btn_3" top="80" left="180" label="恢复默认" click="btn_3_clickHandler(event)"/>
- </s:BorderContainer>
- </s:Panel>
- </s:Application>
方法二:该种方法只需要设置按钮显示不显示就可以了,不用再设置按钮的坐标了。代码如下:
- <?xml version="1.0" encoding="utf-8"?>
- <s:Application xmlns:fx="http://ns.adobe.com/mxml/2009"
- xmlns:s="library://ns.adobe.com/flex/spark"
- xmlns:mx="library://ns.adobe.com/flex/mx"
- creationComplete="application1_creationCompleteHandler(event)"
- >
- <fx:Script>
- <![CDATA[
- import mx.events.FlexEvent;
- private var flag:int;
- protected function application1_creationCompleteHandler(event:FlexEvent):void
- {
- flag = 0;
- resetBtn();
- }
- protected function btn_1_clickHandler(event:MouseEvent):void
- {
- flag = 1;
- resetBtn();
- }
- protected function btn_2_clickHandler(event:MouseEvent):void
- {
- flag = 2;
- resetBtn();
- }
- protected function btn_3_clickHandler(event:MouseEvent):void
- {
- flag = 0;
- resetBtn();
- }
- private function resetBtn():void {
- if (0 == flag) {//默认权限
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = true;
- checkBtn.visible = true;
- printBtn.visible = true;
- addBtn.includeInLayout = true;
- editBtn.includeInLayout = true;
- delBtn.includeInLayout = true;
- checkBtn.includeInLayout = true;
- printBtn.includeInLayout = true;
- }
- if (1 == flag) {//权限一
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = true;
- checkBtn.visible = false;
- printBtn.visible = true;
- addBtn.includeInLayout = true;
- editBtn.includeInLayout = true;
- delBtn.includeInLayout = true;
- checkBtn.includeInLayout = false;
- printBtn.includeInLayout = true;
- }
- if (2 == flag) {//权限二
- addBtn.visible = true;
- editBtn.visible = true;
- delBtn.visible = false;
- checkBtn.visible = true;
- printBtn.visible = true;
- addBtn.includeInLayout = true;
- editBtn.includeInLayout = true;
- delBtn.includeInLayout = false;
- checkBtn.includeInLayout = true;
- printBtn.includeInLayout = true;
- }
- }
- ]]>
- </fx:Script>
- <fx:Declarations>
- <!-- 将非可视元素(例如服务、值对象)放在此处 -->
- </fx:Declarations>
- <s:Panel title="按钮的自动排列演示" top="100" left="300" width="500" height="200">
- <s:HGroup top="5" right="5" gap="2">
- <s:Button id="addBtn" label="添加" visible="false"/>
- <s:Button id="editBtn" label="编辑" visible="false"/>
- <s:Button id="delBtn" label="删除" visible="false"/>
- <s:Button id="checkBtn" label="审核" visible="false"/>
- <s:Button id="printBtn" label="打印" visible="false"/>
- </s:HGroup>
- <s:BorderContainer top="30" left="10" right="10" bottom="10">
- <s:Button id="btn_1" top="50" left="100" label="除了审核外" click="btn_1_clickHandler(event)"/>
- <s:Button id="btn_2" top="50" left="250" label="除了删除外" click="btn_2_clickHandler(event)"/>
- <s:Button id="btn_3" top="80" left="180" label="恢复默认" click="btn_3_clickHandler(event)"/>
- </s:BorderContainer>
- </s:Panel>
- </s:Application>
以上这两种方法都能实现所要求的功能,但功能二比功能一好,原因是,只需要设置按钮的 visible 和 includeInLayout 属性就可以了,而不需要去算按钮的坐标。因为当把按钮的坐标改变后,它的位置就固定了,如果不改回原值的话,按钮就会一直停留在那里。而用 HGroup 标签的好处是,它自动会把按钮移动,使得前面的按钮自动放置到不显示按钮的地方,当不显示的按钮再次显示时,又会显示在自己的默认位置上,而把其它按钮前移。