Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/apache-flex/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Apache flex 空气:切换窗口后组件行为错误_Apache Flex_Air - Fatal编程技术网

Apache flex 空气:切换窗口后组件行为错误

Apache flex 空气:切换窗口后组件行为错误,apache-flex,air,Apache Flex,Air,好的,我有一个组件,它有一个功能,可以在当前的窗口中作为弹出窗口删除自身,并将自身添加到新创建的窗口 但是,如果该组件有一个子组件,如组合框,则该下拉列表仍会在以前的旧窗口中弹出,也会出现滚动条,并且焦点在新窗口中的行为似乎也不正确 在我看来,Flex仍然认为组件是原始窗口的子窗口,而不是新窗口。但我不知道如何解决这个问题 这是我的密码: private var ownWindow:Window; private var _inOwnWindow:Boolean; private var _re

好的,我有一个组件,它有一个功能,可以在当前的
窗口中作为
弹出窗口
删除自身,并将自身添加到新创建的
窗口

但是,如果该组件有一个子组件,如
组合框
,则该下拉列表仍会在以前的旧窗口中弹出,也会出现滚动条,并且焦点在新窗口中的行为似乎也不正确

在我看来,Flex仍然认为组件是原始窗口的子窗口,而不是新窗口。但我不知道如何解决这个问题

这是我的密码:

private var ownWindow:Window;
private var _inOwnWindow:Boolean;
private var _removedEffect:Move;
private var _openX:Number;
private var _openY:Number;

public function launchInNewWindow(e:Event):void
{
    _openX = Application.application.nativeWindow.x + this.x + 5; //keep in same spot add 5 for systemChrom border
    _openY = Application.application.nativeWindow.y + this.y + 30;//keep in same spot add 30 for systemChrom title

    this.parent.removeChild(this);
    ownWindow = new Window();
    ownWindow.systemChrome = 'none';
    ownWindow.type = NativeWindowType.LIGHTWEIGHT;
    ownWindow.transparent = true;
    ownWindow.setStyle('showFlexChrome', false);
    ownWindow.width = this.width > 750 ? 750 : this.width;
    ownWindow.height = this.height > 550 ? 550 : this.height;
    edit.enabled = false;

    _removedEffect = this.getStyle('removedEffect') as Move;
    if(_removedEffect == null)
    {
        openNewWindow();
    }
    else
    {
    // Wait for removed effect to play before adding to new window
_removedEffect.addEventListener(EffectEvent.EFFECT_END,delayOpenInNewWindow);
    }
}

private function delayOpenInNewWindow(e:Event = null):void
{
    var t:Timer = new Timer(100,1);
    t.addEventListener(TimerEvent.TIMER,openNewWindow);
    t.start();
}

private function openNewWindow(e:Event = null):void
{
    ownWindow.addChild(this);
    ownWindow.width += 5; //add to show dropshadow
    ownWindow.height += 10; //add to show dropshadow
    ownWindow.open();
    _inOwnWindow = true;
    ownWindow.nativeWindow.x = _openX;
    ownWindow.nativeWindow.y = _openY;
}
有什么想法吗


谢谢

在我运行之前,您是否尝试过稍后在openNewWindow()行中调用


[跛脚修复尝试,我知道--但是如果removedEffect不是空的,并且计时器似乎是您唯一的选择,那么您似乎没有可以监听的事件,我认为可以尝试跛脚修复:-)

在我运行之前,您是否尝试过稍后在openNewWindow()行上调用


[跛脚修复尝试,我知道--但是如果removedEffect不是空的,并且计时器似乎是您唯一的选择,那么您似乎没有可以监听的事件,我认为尝试跛脚修复是可以的:-)

事实上,下拉列表不是combobox的直接子对象,而是弹出窗口,它是通过PopupManager添加的,链接到combobox作为父项。在添加到新窗口之前/之后,尝试检查下拉列表的父/所有者。您也可以在这里发布完整的代码以获取更多信息。实际上,下拉列表不是combobox的直接子项,而是popup,它是通过PopupManager添加的,链接到combobox作为父项。在添加到新窗口之前/之后,尝试检查下拉列表的父/所有者。你也可以在这里发布完整的代码以获取更多信息。我按照你的建议做了,这可以替代使用计时器,因此我不再需要使用计时器,但它仍然存在相同的问题。我认为这是一个焦点问题,例如,如果有两个文本字段,我点击“tab”,第二个文本字段会高亮显示,就像它有焦点一样,但我仍然在输入第一个文本字段。这很奇怪。我猜问题出在某个地方,就是同一个类正在创建新窗口,而它也在添加自己。无论是否具有removedEffect,问题都会出现。是否有理由需要使用组件的完全相同的实例?您可以使用一个“类似克隆”的函数,该函数获取您希望复制到新窗口的所有属性。。。让它成为一个静态函数,它获取当前组件的一个实例,最后调用一个公共的内部“destroy”函数,该函数将removesChild并删除所有事件侦听器,以便为垃圾收集做好准备。我提出这个建议的原因是:即使你让所有的事情都能顺利进行,但在以后的道路上,你肯定会遇到一些你没有预料到的其他问题。这听起来是个好主意,我会研究一下,如果我让它起作用,我会接受你的答案。另外+1为我提供了一个解决方案,该解决方案(不解决我当前的问题,但)使我能够停止使用计时器来延迟调用方法。我按照您的建议做了,这可以替代使用计时器,因此我不再需要使用计时器,但它仍然存在相同的问题。我认为这是一个焦点问题,例如,如果有两个文本字段,我点击“tab”,第二个文本字段会高亮显示,就像它有焦点一样,但我仍然在输入第一个文本字段。这很奇怪。我猜问题出在某个地方,就是同一个类正在创建新窗口,而它也在添加自己。无论是否具有removedEffect,问题都会出现。是否有理由需要使用组件的完全相同的实例?您可以使用一个“类似克隆”的函数,该函数获取您希望复制到新窗口的所有属性。。。让它成为一个静态函数,它获取当前组件的一个实例,最后调用一个公共的内部“destroy”函数,该函数将removesChild并删除所有事件侦听器,以便为垃圾收集做好准备。我提出这个建议的原因是:即使你让所有的事情都能顺利进行,但在以后的道路上,你肯定会遇到一些你没有预料到的其他问题。这听起来是个好主意,我会研究一下,如果我让它起作用,我会接受你的答案。另外+1为我提供了一个解决方案,该解决方案(不解决我当前的问题,但)使我能够停止使用计时器延迟调用方法。