Reputation: 865
Since Codename One API is similar to AWT/Swing. I'd like to get the same result of the code below but using Codename One:
private void jTextField1KeyTyped(java.awt.event.KeyEvent evt) {
char c = evt.getKeyChar();
if(!(Character.isDigit(c) || (c == KeyEvent.VK_BACK_SPACE) ||
c == KeyEvent.VK_DELETE)) {
getToolkit().beep();
evt.consume();
}
}
This is actually a TextField which only accepts numbers by limiting input types. How to make something similar in Codename One?
OBS: I want to limit the input type for numbers only.
My code so far:
public void keyPressed(final TextField current) {
current.addDataChangedListener((i, ii) -> {
if(isValidInput(current.getText())) {
current.putClientProperty("LastValid", current.getText());
} else {
current.stopEditing();
current.setText((String)current.getClientProperty("LastValid"));
current.startEditingAsync();
}
});
}
public boolean isValidInput(String input){
if(input.contains("a") || input.contains("b") || input.contains("c")
|| input.contains("d") || input.contains("e") || input.contains("f")
|| input.contains("g") || input.contains("h") || input.contains("i")
|| input.contains("j") || input.contains("k") || input.contains("l")
|| input.contains("m") || input.contains("n") || input.contains("o")
|| input.contains("p") || input.contains("q") || input.contains("r")
|| input.contains("s") || input.contains("t") || input.contains("u")
|| input.contains("v") || input.contains("w") || input.contains("x")
|| input.contains("y") || input.contains("z")) {
return false;
}
else {
return true;
}
}
My isValidInput() method seems too long isn't it? Any help?
Upvotes: 2
Views: 728
Reputation: 52760
As discussed in the comments this should work with addDataChangedListener()
. Notice that this won't produce an ideal user experience as the virtual keyboard can have multiple implementations and they don't work via a key event since there is no key...
Something like this should be OK:
myTextField.addDataChangedListener((i, ii) -> {
if(isValidInput(myTextField.getText())) {
lastValidInput = myTextField.getText();
} else {
myTextField.stopEditing();
myTextField.setText(lastValidInput);
myTextField.startEditingAsync();
}
});
Now this might work without start/stop editing which will cause the virtual keyboard to "bounce" but I wouldn't risk it...
You need to define a String field lastValidInput
in the class or replace that code with a client property if you want to write 100% generic code:
myTextField.addDataChangedListener((i, ii) -> {
if(isValidInput(myTextField.getText())) {
myTextField.putClientProperty("LastValid", myTextField.getText());
} else {
myTextField.stopEditing();
myTextField.setText((String)myTextField.getClientProperty("LastValid"));
myTextField.startEditingAsync();
}
});
The isValidInput(String)
method if your validate method, you can run any text there to make sure the text matches your needs whether being numeric or something else.
Upvotes: 1