Flex实现资源管理器(Tree和SuperTabNavigator)遇到的问题

RHuniSoft 2010-12-07 04:52:59
<?xml version="1.0" encoding="utf-8"?>
<s:Application xmlns:flexlib="http://code.google.com/p/flexlib/"
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="initTab();" textAlign="center">
<fx:Declarations>
<fx:XMLList id="treeData">
<node label="1"/>
<node label="2"/>
<node label="3"/>
</fx:XMLList>
</fx:Declarations>
<fx:Script>
<![CDATA[
public var selectedNode:XML;
import flexlib.controls.SuperTabBar;
import flexlib.controls.tabBarClasses.SuperTab;
import flexlib.events.SuperTabEvent;
import flexlib.events.TabReorderEvent;

import mx.containers.Canvas;
import mx.containers.Panel;
import mx.containers.VBox;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.controls.Label;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.IndexChangedEvent;

public function treeChanged(evt:Event):void {
selectedNode = Tree(evt.target).selectedItem as XML;
addTab(selectedNode.@label,tabnav);
}
public function tabChanged(event:TabReorderEvent,label:String):void{
//怎样显示已生成的tab的内容
Alert.show("此时应tabnav的焦点应在"+label+" VBox,但是不知道怎么实现");
}
public function tabClose():void{
//tab关闭时没有触发此事件
Alert.show("是否关闭?",Alert.YES|Alert.NO);
}
public function initTab():void{
tabnav.addEventListener(IndexChangedEvent.CHANGE,tabChanged);
}
public function addTab(label:String, navigator:SuperTabNavigator):void{
var event:TabReorderEvent;
for(var i:int=0;i<navigator.length;i++)
if(tabnav.getTabAt(i).label==label){
tabChanged(event,label);
return ;
}
var box:VBox = new VBox();
box.setStyle("closable", true);
box.label = label;
box.name=label;
box.id=selectedNode.@id;
box.addEventListener(SuperTabEvent.TAB_CLOSE,tabClose);
navigator.addChild(box);
}
]]>
</fx:Script>
<s:Panel right="0" bottom="0" top="0" width="80%">
<flexlib:SuperTabNavigator id="tabnav" scrollSpeed="25"
stopScrollingEvent="{MouseEvent.MOUSE_UP}" startScrollingEvent="{MouseEvent.MOUSE_DOWN}"
width="100%" height="100%" horizontalGap="0" closePolicy="{SuperTab.CLOSE_ROLLOVER}" >
</flexlib:SuperTabNavigator>
</s:Panel>
<s:Panel left="0" bottom="0" top="0" width="20%">
<mx:Tree id="myTree" width="100%" height="100%" labelField="@label" textAlign="left"
showRoot="true" dataProvider="{treeData}" change="treeChanged(event);"/>
</s:Panel>
</s:Application>

出现的问题:
1.若已经生成了SuperTabNavigator中的tab时,再点击对应的树节点不能自动切换到该tab上
2.每一个SuperTabNavigator中的tab关闭时不能执行关闭触发事件,不知为什么
有别的实现方法说说也好,非常感谢
...全文
469 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
cheetach_Jiang 2010-12-12
  • 打赏
  • 举报
回复
讨教了。嘿嘿
leemiki 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 2 楼 leemiki 的回复:]
SuperTabBar.selectedIndex(SuperTabBar.getChildAt(tab对象))
[/Quote]
我都写糊涂了,selectedIndex是一个属性不是方法,难怪你会误以为是private方法

SuperTabBar对象.selectedIndex = SuperTabBar对象.getChildAt(tab对象);

这样就可以了~~~
leemiki 2010-12-08
  • 打赏
  • 举报
回复
1.SuperTabNavigator中tab选中问题可能要改组件源码了,它的API上好像没对外的相关属性方法

实现流程:触发tree的itemClick事件,获取点击节点label:tree.selectedItem.@label

(源码中SuperTabBar继承自TabBar)
遍历SuperTabBar中包含的tab,用节点label去匹配tab的label得到对应的tab对象

设置SuperTabBar.selectedIndex(SuperTabBar.getChildAt(tab对象))即可

2.box.addEventListener(SuperTabEvent.TAB_CLOSE,tabClose);

SuperTabEvent.TAB_CLOSE这个事件应该是在SuperTabNavigator上分发出来的

注册到box上怎么会有效果!!<flexlib:SuperTabNavigator tabClose="closeHandler()"/>

public function closeHandler():void{
//tab关闭时没有触发此事件
Alert.show("是否关闭?",Alert.YES|Alert.NO);
}
RHuniSoft 2010-12-08
  • 打赏
  • 举报
回复
selectedIndex也是private的,我基本把返回值是ViewStack都试了,都不好使,您再帮着想想看吧,麻烦各位牛人了
leemiki 2010-12-08
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 ljh56789 的回复:]

谢谢2楼的回答,原理我都明白了,tab关闭已经没问题了,但是SuperTabBar.selectedIndex和SuperTabBar.selectedChild都是private的函数,不能访问,还有其他可以用吗,我查遍了SuperTabBar的函数,但是没找到,问题就是我知道触发了哪个tab但不知道怎样让SuperTabBar显示这个tab,再次感谢
[/Quote]
是selectedIndex~~

跟ViewStack搭上边的一般就是这么用
passself 2010-12-08
  • 打赏
  • 举报
回复
改成public的就可以了
RHuniSoft 2010-12-08
  • 打赏
  • 举报
回复
谢谢2楼的回答,原理我都明白了,tab关闭已经没问题了,但是SuperTabBar.selectedIndex和SuperTabBar.selectedChild都是private的函数,不能访问,还有其他可以用吗,我查遍了SuperTabBar的函数,但是没找到,问题就是我知道触发了哪个tab但不知道怎样让SuperTabBar显示这个tab,再次感谢
fw176170847 2010-12-08
  • 打赏
  • 举报
回复
<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
layout="absolute"
creationComplete="initTab();"
xmlns:code="http://code.google.com/p/flexlib/">
<mx:XMLList id="treeData">
<node label="1"/>
<node label="2"/>
<node label="3"/>
</mx:XMLList>
<mx:Script>
<![CDATA[
public var selectedNode:XML;
import flexlib.controls.SuperTabBar;
import flexlib.controls.tabBarClasses.SuperTab;
import flexlib.events.SuperTabEvent;
import flexlib.events.TabReorderEvent;

import mx.containers.Canvas;
import mx.containers.Panel;
import mx.containers.VBox;
import mx.controls.Alert;
import mx.controls.DataGrid;
import mx.controls.Label;
import mx.controls.dataGridClasses.DataGridColumn;
import mx.events.IndexChangedEvent;

public function treeChanged(evt:Event):void
{
selectedNode=Tree(evt.target).selectedItem as XML;
addTab(selectedNode.@label);
}

public function tabChanged(label:String, selectIndex:int):void
{
this.tabnav.selectedIndex=selectIndex;
//怎样显示已生成的tab的内容
// Alert.show("此时应tabnav的焦点应在" + label + " VBox,但是不知道怎么实现");
}

public function tabClose():void
{
//tab关闭时没有触发此事件
Alert.show("是否关闭?", Alert.YES | Alert.NO);
}

public function initTab():void
{
// tabnav.addEventListener(IndexChangedEvent.CHANGE, tabChanged);
}

public function addTab(label:String):void
{
for (var i:int=0; i < this.tabnav.numChildren; i++)
if (tabnav.getTabAt(i).label == label)
{
tabChanged(label, i);
return;
}
var box:VBox=new VBox();
box.setStyle("closable", true);
box.label=label;
box.name=label;
box.id=selectedNode.@id;
box.addEventListener(SuperTabEvent.TAB_CLOSE, tabClose);
this.tabnav.addChild(box);
}
]]>
</mx:Script>
<mx:Panel right="0"
bottom="0"
top="0"
width="80%">
<code:SuperTabNavigator id="tabnav"
scrollSpeed="25"
stopScrollingEvent="{MouseEvent.MOUSE_UP}"
startScrollingEvent="{MouseEvent.MOUSE_DOWN}"
width="100%"
height="100%"
horizontalGap="0"
closePolicy="{SuperTab.CLOSE_ROLLOVER}">
</code:SuperTabNavigator>
</mx:Panel>
<mx:Panel left="0"
bottom="0"
top="0"
width="20%">
<mx:Tree id="myTree"
width="100%"
height="100%"
labelField="@label"
textAlign="left"
showRoot="true"
dataProvider="{treeData}"
change="treeChanged(event);"/>
</mx:Panel>
</mx:Application>
RHuniSoft 2010-12-08
  • 打赏
  • 举报
回复
恩,我太菜了,还没分清代码助手的那几个符号有什么区别的,再次感谢天空之城和fw176170847
RHuniSoft 2010-12-07
  • 打赏
  • 举报
回复
里面用了google的flexlib库,下载地址http://flexlib.googlecode.com/files/flexlib%20-%202.5%20-%20flex4.zip

4,328

社区成员

发帖
与我相关
我的任务
社区描述
多媒体/设计 Flex
社区管理员
  • Flex
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧