как применить событие Focus_out не только к выбранному компоненту - PullRequest
1 голос
/ 15 апреля 2011

Я использую код, основанный на этом сообщении .

Он использует событие focus_out, чтобы определить, есть ли изменение, которое необходимо зафиксировать. Однако я заметил, что событие FOCUS_OUT вызывается только в том случае, если вы щелкнете вне текстового поля, но внутри компонента. Можно ли как-то прослушивать щелчки за пределами компонента внутри компонента?

    addEventListener(FocusEvent.FOCUS_OUT, onFocusOut);

    protected function onFocusOut(event:FocusEvent):void
    {
        _updatedText = text;

        if(_updatedText != _originalText){
            dispatchEvent(new Event(Event.CHANGE));
        }

        setEditable(false);
    }

Ответы [ 2 ]

2 голосов
/ 15 апреля 2011

В самом компоненте вы можете сделать это:

systemManager.addEventListener( FocusEvent.KEY_FOCUS_CHANGE, focusChangeHandler );
systemManager.addEventListener( FocusEvent.MOUSE_FOCUS_CHANGE, focusChangeHandler );

Просто убедитесь, что вы очистили и удалили прослушиватель событий, прежде чем ваш компонент будет удален со сцены (при условии, что он добавлен динамически). Это не позволит вам собрать кучу слушателей событий.

В качестве альтернативы, если вы просто хотите узнать, когда кто-то щелкает за пределами определенного компонента, вы можете сделать что-то вроде этого:

systemManager.addEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );

private function system_mouseDownHandler( event:MouseEvent ):void {
  if( !event.target != this && !this.contains(event.target as DisplayObject) ){
    // Do Something Here
  }
}

Опять же, убедитесь, что вы очищаете любые прослушиватели событий, если этот компонент добавляется / удаляется динамически.

Надеюсь, это поможет!

EDIT:

Если вы хотите очистить eventListeners, сделайте что-то вроде этого (вызывается, когда в вашем компоненте запускается событие удаления):

<mx:Component remove="myRemoveHandler();" />

private function myRemoveHandler():void {
  if( systemManager.hasEventListener( MouseEvent.MOUSE_DOWN ) systemManager.removeEventListener( MouseEvent.MOUSE_DOWN, system_mouseDownHandler );
}

Очевидно, замените прослушиватели событий, которые вы в конечном итоге использовали (Focus или Mouse).

1 голос
/ 15 апреля 2011

В классе LabelEditor отправляет событие Event.CHANGE на фокусе, вы можете просто прослушать это событие

...