2009-07-06 119 views
1

我想在运行时复制flex组件。克隆flex组件

例如,如果我有这个

MX:按钮标签= “BTN” ID = “BTN” 点击= “handleClick(事件)”/>

我应该能够调用一个函数调用DuplicateComponent(),它应该返回一个UI组件,与上面的按钮完全相同,包括事件侦听器。

有人可以帮我吗? 在此先感谢

回答

5

做一个字节数组复制。此代码段应该为你做:

// ActionScript file 
import flash.utils.ByteArray; 

private function clone(source:Object):* 
{ 
    var myBA:ByteArray = new ByteArray(); 
    myBA.writeObject(source); 
    myBA.position = 0; 
    return(myBA.readObject()); 
} 

一个说明,我没有写这个代码我自己,我敢肯定我是从Flex的编码器的列表上的帖子。

0

您不能本机地获取UIComponents的深层副本。最好的办法是创建一个新的并分析你必须添加一个重复的设置。说实话,这听起来像是一种代码味道。我不知道是否有可能是一个更好的解决问题有点反思的..

+0

感谢名单詹姆斯的帮助下副本,但我想实现的是,我有一个充当布局设计,具有一定的可编辑的文本域,图像,动态画布在那里绘制的形状,所以完成设计过程后,我需要在单独的弹出窗口中预览整个布局。所以为此,我需要克隆或复制整个布局画布,包括其子项到弹出窗口中的新画布。所以我怎么能做到这一点。有没有办法做同样的事情?提前感谢 – 2009-07-06 11:54:37

+0

我得到你。如果我要创建一个预览,假设这个预览不是以任何方式交互的,那么更好的方法是创建一个包含组件的绘制图像的BitmapData对象。这将使英里更有效率和更清洁的方法。 – 2009-07-06 12:28:26

+0

Thanx詹姆斯..这正是我想要的! 我已经通过您建议的BitmapData方法创建了对象副本: \t var bd:BitmapData = new BitmapData(layout_cnv.width,layout_cnv.height); bd.draw(layout_cnv); var ba:ByteArray; ba =(new PNGEncoder())。encode(bd); //这个下面的方法应该在弹出窗口的初始化时被调用。 Img_new.load(parentApplication.ba),其中Img_new是弹出窗口中的图像文件。 再次感谢。 – 2009-07-07 11:36:36

0

为同一个问题:http://www.flexforum.org/viewtopic.php?f=4&t=1421

在谷歌搜索一样的东西显示出来。所以你在一个月之后削减了&粘贴相同的问题。没有运气呃?

有没有简单的方法来做到这一点,我知道。许多组件的设置都依赖于容器/上下文等等,并在创建过程中得到实例化,所以没有理由从这个角度进行克隆。

您可以在actionscript中克隆关键设置,并在创建新元素时使用这些设置。

举例来说,假设你只在乎性,你可能有一个数组[“的styleName”,“宽度”,“高度”,...],和你也许可以使用数组是这样的:

var newUI:UIComponent = new UIComponent(); 
for each(var s:String in propArray) { 
    newUI[s] = clonedUI[s]; 
} 

如果你想在你的问题上有更多的叮咬(而不是等待一个月),告诉我们你想达到的目标。

+0

是的格伦dats真的,我已经发布了相同的问题,因为要求是所有类似的。 我想要实现的是我有一个充当布局设计的画布,它具有一些可编辑的textareas,图像,在那里绘制的动态形状,因此在完成设计过程后,我需要预览整个布局一个单独的弹出窗口。 因此,为此,我需要克隆或复制整个布局画布,包括其子项到弹出窗口中的新画布。 所以我怎么能做到这一点。 有没有办法做同样的事情? Thanx提前。 – 2009-07-06 11:53:51

1

要解决这个问题,您应该使用actionscript并动态地创建按钮。

比方说,你想要的按钮(一个或多个)在一个名为“someVbox”

for (var i:uint = 0; i< 10; i++){ 
    var but:Button = new Button(); 
    but.label = 'some_id_'+i; 
    but.id = 'some_id_'+i; 
    but.addEventListener(MouseEvent.CLICK, 'handleClick'); 
    someVbox.addChild(but); 
} 

我没有测试它的VBox去,但应增加10个按钮的VBOX有一点点运气。

0

mx.utils.ObjectUtil经常派上用场,但是对于复杂的对象类型,实现需要.clone()方法的接口通常是一种很好的做法,类似于克隆事件的方式。

例如:

class MyClass implements ICanvasObject 
{ 
    ... 

    public function clone():ICanvasObject 
    { 
     var obj:MyClass = new MyClass(parameters...); 
     return obj; 
    } 
} 

这使你的代码更清晰和正确封装在对象如何被使用的上下文的关注/克隆。

0

你是对的,但根据我的理解UI组件不会被mx.utils.ObjectUtil克隆。

从:http://livedocs.adobe.com/flex/201/langref/mx/utils/ObjectUtil.html#copy()

copy()方法

公共静态函数副本(值:对象):对象 复制指定对象,并返回到副本的引用。该副本是使用本机序列化技术制作的。这意味着在复制期间将遵守自定义序列化。

此方法用于复制数据对象,如集合的元素。它不适用于复制UIComponent对象,如TextInput控件。如果要创建特定UIComponent对象的副本,则可以创建组件的子类并实现clone()方法或其他方法来执行副本。

参数value:Object - 应该复制的对象。

返回Object - 指定对象