2011-04-14 16 views
2

我試圖在我的應用程序中使用flexlib schedule viewerFlexlib scheduleViewer ..如何處理項目上的點擊

我想要它,所以當我點擊一個預定的事件,它會調用我的主應用程序中的一個函數(這將允許我編輯事件)。但是對於類中內置的任何東西,似乎沒有任何特定的功能,即當我點擊某個事件時不會發送任何事件。

我可以使用「點擊」功能,以檢測該項目已被點擊..並嘗試這樣的事情:

  private function exerciseClickHandler(event:MouseEvent):void{ 
      if (exerciseSeries.selectedItem != null){ 
       //code 

      } 
     } 

    <code:ScheduleViewer id="exerciseSeries" click="exerciseClickHandler(event)" /> 

這種方法並不十分可靠,因爲如果它只能在第一次..一旦一個項目被選中,它將保持選中狀態,以便該項目的所有下列點擊都符合條件。

有什麼方法可以確定事件是否被點擊?

或者當我點擊一個事件時,還必須擴展組件並添加某種clickEvent。

回答

3

由於單擊組件時exerciseClickHandler正在啓動,這是行不通的嗎?

而不是

private function exerciseClickHandler(event:MouseEvent):void{ 
    if (exerciseSeries.selectedItem != null){ 
      //code 
    } 
} 

private function exerciseClickHandler(event:MouseEvent):void{ 
    switch (exerciseSeries.selectedItem) 
    { 
      //code 
      case xy: 
      break; 
    } 
} 

private function exerciseClickHandler(event:MouseEvent):void{ 
    //do something with exerciseSeries.selectedItem 
} 

我的意思是,你寫的被點擊的第一個元素後,一切都停止。根據你提供的代碼,它必須停止,因爲它被選中後,第一次點擊exerciseSeries.selectedItem不再是null。所以刪除你寫的條件並使用實例。

+0

我在下面的評論中提到了它的工作方式(點擊後取消選擇該項目),但這絕對是更優雅! – Damon 2011-04-25 05:10:54

1

我建議你設置一個ChangeWatcher,以關注selectedItem(或selectedItems,如果你打算在某個時候允許多個選擇)。例如:

protected exerciseSeriesCreationCompleteHandler(event:FlexEvent):void{ 
    ChangeWatcher.watch(this,['exerciseSeries','selectedItem'], handleChange_SelectedItem); 
} 

protected function handleChange_SelectedItem(event:PropertyChangeEvent):void{ 
    // Either 
    dispatchedEvent(//some custom event); 
    // Or 
    someDirectMethodCall(); 
} 

另一種方法是在用戶單擊時在鼠標座標下的視圖層次結構中搜索事件類的實例。

//Attach this click handler to the component 

    private function handleClick(event : MouseEvent) : void { 
     var obj : *EventClass*= null; 
     var applicationStage : Stage = FlexGlobals.topLevelApplication.stage as Stage; 

     var mousePoint : Point = new Point(applicationStage.mouseX, applicationStage.mouseY); 
     var objects : Array = applicationStage.getObjectsUnderPoint(mousePoint); 

     for (var i : int = objects.length - 1; i >= 0; i--) { 
      if (objects[i] is *EventClass*) { 
       obj = objects[i] as *EventClass*; 
       break; 
      } 
     } 

    if(obj is *EventClass*){ 
     //Dispatch some custom event with obj being the item that was clicked on. 
    } 
} 

如果事件類是類代表事件

+0

我實際上是以一種比較簡單的方式去處理它:在檢測到它被選中後將選定的項目設置爲null ..它不是完美的必然BC你不能選擇項目,但它適用於我的目的就好! – Damon 2011-04-19 03:42:50

0

我有過類似的問題,有時你可以用包裝帶框的對象,並把包裝盒上的點擊事件度日對象。如果你還沒有嘗試過,這是一個便宜,簡單的解決方案(如果它適合你)。

<mx:Box click="exerciseClickHandler(event)"> 
<code:ScheduleViewer id="exerciseSeries" /> 
</mx:Box> 
相關問題