Simple
Simple

Reputation: 865

How to make TextField which only accepts numbers in Codename One?

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

Answers (1)

Shai Almog
Shai Almog

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

Related Questions