Итак, при изменении фокуса я хочу запустить "end_preview_on_focus_change()"
но это не работает.
Насколько я понимаю, я думаю, что холст вообще не получает никакого фокуса. Я пытался использовать focusManager.setFocus, чтобы сделать это после завершения создания холста. но даже это дает мне ошибку.
код, который я пробовал на Creation.Complete:
private function get_focus_on_canvas(e:FlexEvent)
{
focusManager.setFocus(e.target);
//Alert.show("testing img complete");
}
это дает мне ошибку "1118: неявное принуждение значения со статическим типом объекта к возможно несвязанному типу mx.managers:IFocusManagerComponent".
в основном я просто хочу использовать событие фокуса на холсте.
Может ли кто-нибудь помочь мне с этим... Я давно занимаюсь этим вопросом.
С уважением Зишан
Вы импортировали указанную библиотеку? Treby 14.12.2009
Ошибка правильная. У вас есть объект типа Object, который вы пытаетесь использовать как IFocusManagerComponent. Так не пойдет. Чтобы выполнить эту строку кода, вам нужно сделать что-то вроде
Это, конечно, предполагает, что цель реализует IFocusManagerComponent. В противном случае это выдаст вам ошибку (и, вероятно, в этом случае, потому что Canvas не указан как IFocusManagerComponent). Хорошая новость заключается в том, что у Canvas есть метод drawFocus, который делает то же самое.
Что касается вашего события MOUSE_FOCUS_CHANGE, оно будет запущено только в том случае, если объект уже имеет фокус, а затем теряет его. Я думаю, вам лучше использовать FlexEvent.CREATION_COMPLETE. Это гарантирует, что компонент зарегистрировал себя со всеми соответствующими классами в Flex SDK, чтобы FocusManager мог даже знать о новом объекте. Что бы вы ни делали, не пытайтесь установить фокус на что-то, что не было добавлено на сцену (например, было вызвано Event.ADDED).
Еще один совет - всплывающие окна Event.ADDED, убедитесь, что event.currentTarget == event.target вы слушаете правильный объект. В противном случае вы можете ошибочно вызывать одну и ту же функцию несколько раз.
Ответ 2 · рейтинг 2 · Amarghosh
Только несколько классов реализуют IFocusManagerComponent, как уже упоминалось, и Canvas не является одним из них. Если вам действительно необходимо вызвать FocusManager.setFocus(), вам придется расширить класс холста, чтобы реализовать этот интерфейс, и вместо этого использовать этот класс. Вам не нужно писать никаких методов для реализации этого интерфейса, все методы уже реализованы самим UIComponent
//FocusableCanvas.as (include appropriate package and import statements)
public class FocusableCanvas extends Canvas implements IFocusManagerComponent
{
public function FocusableCanvas()
{
super();
}
}
//Now use this class instead of Canvas
this.cvs_preview = new FocusableCanvas();
//setFocus in creation complete handler
FocusManager.setFocus(IFocusManagerComponent(e.target));
Но если все, что вы хотите сделать, это установить фокус на холсте при его создании, вы можете вместо этого вызвать canvas.setFocus() из обработчика creationComplete.
private function get_focus_on_canvas(e:FlexEvent)
{
Canvas(e.currentTarget).setFocus();
trace("done");
}
Ответ 3 · рейтинг 1 · Aaron
Я вижу две проблемы и идеальных решений нет. Если повезет, это может вам помочь.
Прежде всего, e.target возвращает приведение типа объекта к типу Object. Это объясняет вашу неявную ошибку принуждения, потому что Object не реализует IFocusManagerComponent.
Во-вторых, iFocusManagerComponent реализуется только Accordion, AdvancedListBase, Button, ButtonBar, ChartBase, ComboBase, DateChooser, DateField, HTML, ListBase, MenuBar, NumericStepper, TabNavigator, TextArea, TextInput, UIMovieClip согласно эту запись в справочнике по Flex 3.4 AS3.
Это наводит меня на мысль, что элемент Canvas не может получить фокус и просто унаследовал доступ к FocusManager через наследование UIComponent.
Единственные решения, которые я вижу, - это использовать что-то другое, кроме Canvas, для решения ваших проблем, связанных с фокусом, или подкласс Canvas и реализовать iFocusManagerComponent, хотя это выглядит довольно сложно.
Изменить Приносим извинения за отсутствие функции drawFocus в приведенном выше решении.
Ответ 4 · рейтинг -1 · aslanpayi
Попробуйте;
private function get_focus_on_canvas(e:FlexEvent)
{
this.cvs_preview.setFocus();
}