Nonostante il commento che ho scritto alla tua domanda, sembra che l'evento migliore per gestire è KeyUpEvent
. In questo caso è possibile ottenere il corretto test di KeyCode
e per il modificatore. La stessa situazione vale per KeyDownEvent
, tuttavia, come l'utente tiene il chiave CTRL, si otterrà più KeyDownEvents
aspettando di premere il INVIO chiave, mentre ci dovrebbe essere solo un singolo KeyUpEvent
.
Anche questa soluzione sembra più compatibile con più browser rispetto ai test per charCode() == 10
in KeyPressEvent
. Firefox non sembra per impostare il charCode a 10 per CRTL +INVIO.
Ecco il codice che ho usato per testare in Chrome, IE8, e FF8:
package com.test.gwt.client;
import com.google.gwt.core.client.EntryPoint;
import com.google.gwt.event.dom.client.KeyCodes;
import com.google.gwt.event.dom.client.KeyDownEvent;
import com.google.gwt.event.dom.client.KeyDownHandler;
import com.google.gwt.event.dom.client.KeyPressEvent;
import com.google.gwt.event.dom.client.KeyPressHandler;
import com.google.gwt.event.dom.client.KeyUpEvent;
import com.google.gwt.event.dom.client.KeyUpHandler;
import com.google.gwt.i18n.client.NumberFormat;
import com.google.gwt.user.client.ui.RootPanel;
import com.google.gwt.user.client.ui.TextArea;
import com.google.gwt.user.client.ui.TextBox;
/**
* Entry point classes define <code>onModuleLoad()</code>.
*/
public class GwtTest implements EntryPoint {
private TextArea messages;
/**
* This is the entry point method.
*/
public void onModuleLoad() {
// Add the textbox to receive events and a place to write messages
final TextBox nameField = new TextBox();
nameField.setText("");
messages = new TextArea();
messages.setText("");
RootPanel.get().add(nameField);
RootPanel.get().add(messages);
messages.setSize("75%", "400px");
// Focus the cursor on the name field when the app loads
nameField.setFocus(true);
nameField.addKeyUpHandler(new KeyUpHandler() {
@Override
public void onKeyUp(KeyUpEvent event) {
printMessage("KeyUpEvent",
event.getNativeKeyCode(),
event.isAnyModifierKeyDown(),
event.isControlKeyDown());
}
});
nameField.addKeyPressHandler(new KeyPressHandler() {
@Override
public void onKeyPress(KeyPressEvent event) {
printMessage("KeyPressEvent",
event.getCharCode(),
event.isAnyModifierKeyDown(),
event.isControlKeyDown());
}
});
nameField.addKeyDownHandler(new KeyDownHandler() {
@Override
public void onKeyDown(KeyDownEvent event) {
printMessage("KeyDownEvent",
event.getNativeKeyCode(),
event.isAnyModifierKeyDown(),
event.isControlKeyDown());
}
});
}
public void printMessage(String eventName, int code, boolean modifier, boolean control) {
final NumberFormat formatter = NumberFormat.getDecimalFormat();
String message = eventName + " - Char Code: " + formatter.format(code) + ". ";
if(code == KeyCodes.KEY_ENTER) {
message += "Key is ENTER. ";
}
if(modifier)
message += "Modifier is down. ";
if(control)
message += "CTRL is down. ";
messages.setText(messages.getText() + "\n\n" + message);
}
}
fonte
2011-12-09 17:56:07
Quale evento sono di manovrare? Trovo che quando si cerca di catturare le chiavi di invio è meglio gestire il KeyPressEvent. –
Sto cercando di catturare KeyPressEvent con KeyPressHandler – maks
Questa è una bella pagina per il test JS eventi chiave: http://www.quirksmode.org/js/keys.html. In basso puoi testare eventi chiave; dovrai testare con alcuni browser diversi. Certo, non è GWT ma l'ho trovato utile. –