2010-07-09 5 views
2

Flex Air 앱에서 활성 창 뒤에 창을 여는 방법은 무엇입니까? (window 2)이 뒤에 열 것, 나는 번째 윈도 3 초, 주요 응용 프로그램 창 뒤에 열고 기대, 활성 창 뒤의 창 열림

나는 다음과 같은 시도하고 나는이 코드

<s:WindowedApplication 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="onCreationComplete(event)"> 

    <fx:Script> 
     <![CDATA[ 
      import mx.events.FlexEvent; 

      import spark.components.Window; 

      private var window1:Window = new Window(); 
      private var window2:Window = new Window(); 
      private var timer:Timer  = new Timer(3000,1); 

      private function onCreationComplete(event:FlexEvent):void 
      { 
       window1   = new Window(); 
       window1.title = "Window 1"; 
       window1.width = 200; 
       window1.height = 200; 
       window1.open(false); 
       window1.orderInBackOf(this); 

       window2   = new Window(); 
       window2.title = "Window 2"; 
       window2.width = 200; 
       window2.height = 200; 

       timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2, false, 0, true); 
       timer.start();   
      } 

      private function openWindow2(event:TimerEvent):void 
      { 
       window2.open(false);  
       window2.orderInBackOf(window1); 
      } 
     ]]> 
    </fx:Script> 
</s:WindowedApplication> 

을 작동시킬 수없는 것 window1. 그러나 이것을 실행하면 주 창 상단에 window1이 열리고 window1 상단에는 window2가 열리 며 주 앱에는 포커스가 유지됩니다. 이것은 Flex의 버그처럼 보입니다. 그렇다면이 문제에 대한 해결 방법이 있습니까?

답변

0

useWeakReference 매개 변수를 true로 설정하는 특별한 이유가 있습니까? 그렇지 않으면 다음을 호출 할 수 있습니다.

timer.addEventListener(TimerEvent.TIMER_COMPLETE, openWindow2); 

그러나이 코드 줄에는 버그가 있습니다. TIMER_COMPLETE 이벤트는 타이머가 모든주기를 완료하면 시작됩니다. 무제한으로 타이머를 설정했습니다. 따라서 사이클을 완료하지 않습니다.

는 다음에 코드 줄을 수정해야 당신은 당신의 예상 결과를 얻을해야합니다 번째 윈도가 뒤에 표시되지 않는 이유 (두 번째 질문을 해결하기 위해

timer.addEventListener(TimerEvent.TIMER, openWindow2); 




을 신청). orderInBackOf 함수의 반환 값으로 판단 다음 윈도우가 보이지 않는 경우

Boolean — true if the window was succesfully sent behind; 
      false if the window is invisible or minimized. 

그것은 그 순서를 보이는 것은 실패합니다. creationComplete 핸들러에 코드를 추가하여 응용 프로그램 윈도우가 자신을 표시하기 전에이 함수를 호출 할 수 있습니다. openWindow2 함수 내에서 해당 코드를 이동해보십시오. Yeilding :이 어떤 식 으로든 도움이되기를 바랍니다

 private function openWindow2(event:TimerEvent):void 
     { 
      window1.orderInBackOf(this); 
      window2.open(false);  
      window2.orderInBackOf(window1); 
     } 

,

  • gMale는

편집 : 내 마지막 댓글이 시도 당

 private function openWindow2(event:TimerEvent):void 
     { 
      window1.depth = 5; //arbitrary number 
      window2.depth = 4; 
      window1.open(false); //assumes window1 isn't opened before 
      window2.open(false);      
     } 
+0

그래의 useWeakReference가 년후 ... 그것을 사랑 필요는 없지만 TIMER_COMPLETE이 맞습니다. 내 코드를 보면 타이머를 한 번만 반복하도록 설정했습니다. 첫 번째 실행 후 TIMER_COMPLETE이 (가) 실행됩니다. 글쎄, 윈도우가 보이기 전에 orderInBackOf를 호출하고 있었다는 것이 문제라고 생각합니다. window1.orderInBackOf (this) to openWindow2를 움직이면 main1 뒤에 window1이 옮겨졌습니다. 그러나 이것은 내가 원하는 행동이 아닙니다. 주 앱 뒤에 창 1을 열지 않고 창 1을 열고 싶습니다. OpenInBackOf() 함수가 있었으면 좋겠어. 아니면 열려있는 (거짓) 활성 창 뒤에 열어야한다. – lordofthefobs

+0

@Sang : open (true)을 사용 해보자. - 창을 열었을 때 포커스를주고, 차이가 있는지 확인한다. 당신은 타이머 일에 대해 옳았습니다. 왜 처음으로 그것을 잘못 읽었는지 모르겠습니다. 나는 TIMER 이벤트를 어쨌든 사용하여 변경 사항이 있는지 확인하려고합니다. – gMale

+0

@Sang : Adobe의 – gMale

0

는 그래서 것 같다 이 문제를 해결할 좋은 방법은 없습니다. 해결 방법은 AIREvent.WINDOW_COMPLETE에 대한 이벤트 리스너를 추가하고 이벤트 핸들러에서 윈도우를 이동하는 것입니다. 이것은 "올바른"해결 방법처럼 보이고 원래의 예제와 같은 간단한 경우에 효과적입니다. 문제는이 방법이 내 코드에서 작동하지 않는다는 것입니다.

sdk에서 spark.components.Window 코드를 보면 commitProperties()에서 창을 열 때 Event.ENTER_FRAME에 대한 이벤트 리스너가 추가 된 것을 볼 수 있습니다. 그런 다음 이벤트 처리기 인 enterFrameHandler()에서 카운터를 유지하고 두 번째 프레임에서는 AIREvent.WINDOW_COMPLETE 이벤트를 전달합니다. 이 날은 livedoc 말한다하더라도 AIREvent.WINDOW_COMPLETE 이벤트에 관계없이 윈도우의 상태를 두 번째 프레임에 발사 것이라고 생각한다 : 창 가 초기 배치를 완료하고 기초를 NativeWindow가 열릴 때

이 전달됩니다.

두 번째 프레임에서 내 윈도우가 가득 차서 orderInBackOf가 생성되지 않았다고 추측하고 있습니다.

첫째, 내 창에, 나는 (openWindowActive)를 개방 오버라이드 (override) :


그래서 여기 내 해결 방법입니다. openWindowActive가 false이면 Event.ENTER_FRAME에 대한 이벤트 리스너를 추가합니다. 이벤트 처리기에서 카운터를 유지하고 프레임 수가 특정 숫자 (현재 당장)에 도달하면 현재 창을 활성 창 뒤로 이동합니다. 이것은이 문제를 해결하기위한 매우 해킹 된 방법입니다. 나는 한도를 늘려 왔고 지금은 약 90 %의 성공을 거두고 있습니다. 내가 100 %에 가까워 질 때까지 한계를 계속해서 늘릴 수는 있지만 창을 변경할 때마다이 조건을 확인하지 않아도됩니다. 또한이 조건은 기계에 따라 다를 수 있습니다. 누군가가 내 해결이 얼마나 잘못 말해 내 문제를 해결하기 위해 훨씬 더 좋은 방법을 말해 ...하지만 다음이해야 할 것까지 할 수있는 경우

나는