flex - sirve - tecla que reemplaza el enter
¿Cuál es la mejor manera de hacer que un botón Flex 3 responda a la tecla Intro? (7)
Claro, podrías hacer algo como esto:
<mx:Script>
<![CDATA[
import mx.controls.Alert;
private function btn_click(event:MouseEvent):void
{
Alert.show("Clicked!");
}
private function btn_keyDown(event:KeyboardEvent):void
{
if (event.keyCode == Keyboard.ENTER)
btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK));
}
]]>
</mx:Script>
<mx:Button id="btn" label="Click Me" click="btn_click(event)" keyDown="btn_keyDown(event)" />
... aunque no soy un gran fanático de distribuir eventos en objetos fuera de esos objetos. Un enfoque más limpio podría ser subclasificar el botón, agregar los oyentes y los manejadores dentro de su subclase, y luego enviar el evento de clic desde esa clase. Pero esto debería ayudar a ilustrar el punto. ¡Buena suerte!
En Flex 3, los botones llaman a su manejador de clics cuando son presionados por el mouse, o cuando tienen el foco y el usuario presiona la barra espaciadora.
¿Existe una forma directa de provocar que los botones Flex 3 con foco llamen a su manejador de clics cuando el usuario presiona la tecla enter?
Para algo así como un formulario de inicio de sesión, necesita usar un formulario mx: aquí está el fragmento de código que lo ilustra:
<mx:Form defaultButton="{loadButton}">
<mx:TextInput id="feedURL" />
<mx:Button id="loadButton" label="Load" click="someHandler(event)" />
</mx:Form>
Ingrese la url y presione enter, bam, comportamiento esperado.
Buscado en Google desde aquí
Pruebe el evento "buttonDown"; puede ser enviado en cualquier caso. De lo contrario, es probable que estés mirando usando "keyDown" y verificando la tecla que se presionó.
Aun mejor
private function setValidationFocus(formObject:Object):void
{
formObject.setFocus();
formObject.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OUT)); // sneaky sneaky
formObject.dispatchEvent(new MouseEvent(MouseEvent.MOUSE_OVER));
}
Si está enviando un formulario como un diálogo de inicio de sesión o similar, la propiedad "enter" en el TextField es una gran solución:
<mx:TextInput displayAsPassword="true" id="wPassword" enter="handleLoginSubmit()"/>
También puede agregar el oyente KEY_DOWN
en la respuesta de Christian al botón mismo. Solo asegúrate de llamar a stopImmediatePropagation. En este ejemplo, dejo que cualquier tecla cause la acción del botón. Y estoy usando el mismo controlador, así que permito cualquier tipo de "Evento". Puede usar diferentes manejadores "cancelClick".
protected function cancelClick(e:Event = null):void{
this.dispatchEvent(new Event(Event.CANCEL)); // do component action
e.stopImmediatePropagation();
}
override protected function partAdded(partName:String, instance:Object):void {
super.partAdded(partName,instance);
switch(instance){
case cancel:
cancel.addEventListener(MouseEvent.CLICK,cancelClick);
cancel.addEventListener(KeyboardEvent.KEY_DOWN,cancelClick);
}
}
He visto el mismo problema, pero la respuesta de Christian Nunciato me parece que es la mejor. Una cosa más para agregar a su solución, creo que el indicador de burbujeo en btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK))
, debe establecerse en false (btn.dispatchEvent(new MouseEvent(MouseEvent.CLICK, false)))
porque el evento debe estar aislado en el botón.