2011-11-07 29 views
19

Tôi có một yêu cầu mà tôi cần phải cho phép chỉ số trong hộp văn bản. nếu người dùng cố gắng nhập bất kỳ ký tự nào khác ngoài số thì chúng tôi cần hủy sự kiện. Xin hãy giúp tôi làm thế nào để đạt được điều này?Chỉ cho phép các số trong hộp văn bản trong GWT?

Cảm ơn!

Trả lời

15

Bạn chỉ cần xác thực người dùng nhập vào một sự kiện nhất định. Nó có thể là ví dụ trên mọi phím tắt (KeyPressEvent), khi TextBox mất tiêu điểm (ValueChangeEvent), trên một nút bấm (ClickEvent), v.v. Bạn triển khai trình xử lý sự kiện, ví dụ: KeyPressHandler và đăng ký triển khai của bạn với TextBox. Sau đó, trong trình xử lý của bạn, bạn xác nhận giá trị TextBox và nếu nó chứa một cái gì đó khác với số, bạn chỉ cần trả về từ phương thức, có thể bằng cách nào đó nói cho người dùng biết rằng giá trị không hợp lệ.

Something như thế này:

final TextBox textBox = new TextBox(); 
textBox.addKeyPressHandler(new KeyPressHandler() { 
    @Override 
    public void onKeyPress(KeyPressEvent event) { 
     String input = textBox.getText(); 
     if (!input.matches("[0-9]*")) { 
      // show some error 
      return; 
     } 
     // do your thang 
    } 
}); 

Nếu bạn có rất nhiều xác nhận để làm, có thể bạn muốn giới thiệu một số khuôn khổ xác nhận đó giúp bạn tiết kiệm từ rất nhiều reinventing the wheel. Có thể có lựa chọn thay thế tốt hơn ngày nay nhưng cá nhân tôi đã khá hài lòng với GWT-VL validation framwork.

+0

Bằng cách này, đây là nội dung khá cơ bản và bạn sẽ có thể giải quyết vấn đề này bằng một chút googling. – toman

+6

Bất kỳ lý do cụ thể nào để không sử dụng GWT ValueBox , DoubleBox, IntegerBox hoặc LongBox với tất cả xác thực, định dạng và hỗ trợ I18N !!! – SSR

+2

sẽ backspace làm việc với điều này .. và điều hướng bằng cách sử dụng phím Tab ..? – knocker

11

Sau đây là cách tiếp cận chung hơn và cho phép sử dụng lại mã. Bạn có thể sử dụng trình xử lý NumberOnly cho bất kỳ hộp văn bản nào (thuộc cùng một lớp) mà bạn muốn.

intbox1.addKeyPressHandler(new NumbersOnly()); 
intbox2.addFocusHandler(new OnFocus()); 


//inner class 
class NumbersOnly implements KeyPressHandler { 
     @Override 
     public void onKeyPress(KeyPressEvent event) { 
      if(!Character.isDigit(event.getCharCode())) 
       ((IntegerBox)event.getSource()).cancelKey(); 
     } 
    } 
+5

cách backspace và phím tab sẽ được xử lý? – knocker

+0

@knocker - Điều này sẽ ngăn chặn backspace, tab, sao chép/dán, nhà/kết thúc, chọn tất cả và nhập từ hoạt động đúng. cuộc gọi cancelKey ngăn chặnDefault đằng sau hậu trường. Trong khi giải pháp này một phần hoạt động, nó rất hạn chế. – sixtyfootersdude

6
class NumbersOnly implements KeyPressHandler { 

     @Override 
     public void onKeyPress(KeyPressEvent event) { 
      if (!Character.isDigit(event.getCharCode()) 
        && event.getNativeEvent().getKeyCode() != KeyCodes.KEY_TAB 
        && event.getNativeEvent().getKeyCode() != KeyCodes.KEY_BACKSPACE){ 
       ((IntegerBox) event.getSource()).cancelKey(); 
      } 
     } 
    } 
+0

Phím xóa lùi không hoạt động đối với tôi khi sử dụng mã này trong Firefox và Safari (chưa thử nghiệm các mã khác) trên GWT 2.5. Điều này cũng sẽ không hoạt động với sao chép/dán, các phím mũi tên, nhà/kết thúc hoặc chọn tất cả. – sixtyfootersdude

4

tôi thêm ngoại lệ khác ví dụ như khả năng để sao chép các số. Nó vẫn ngăn cản việc dán nội dung từ clipboard.

public class NumbersOnlyKeyPressHandler implements KeyPressHandler { 
    @Override 
    public void onKeyPress(KeyPressEvent event) { 

     switch(event.getNativeEvent().getKeyCode()) { 
     case KeyCodes.KEY_TAB: 
     case KeyCodes.KEY_BACKSPACE: 
     case KeyCodes.KEY_DELETE: 
     case KeyCodes.KEY_LEFT: 
     case KeyCodes.KEY_RIGHT: 
     case KeyCodes.KEY_UP: 
     case KeyCodes.KEY_DOWN: 
     case KeyCodes.KEY_END: 
     case KeyCodes.KEY_ENTER: 
     case KeyCodes.KEY_ESCAPE: 
     case KeyCodes.KEY_PAGEDOWN: 
     case KeyCodes.KEY_PAGEUP: 
     case KeyCodes.KEY_HOME: 
     case KeyCodes.KEY_SHIFT: 
     case KeyCodes.KEY_ALT: 
     case KeyCodes.KEY_CTRL:break; 
     default: 

      if(event.isAltKeyDown() || (event.isControlKeyDown() && (event.getCharCode() != 'v'&& event.getCharCode() != 'V')) ) 
       break; 

      if(!Character.isDigit(event.getCharCode())) 
        if(event.getSource() instanceof IntegerBox) 
         ((IntegerBox)event.getSource()).cancelKey(); 
     } 
    } 
} 
1

Hãy thử điều này một:

public void onKeyPress(KeyPressEvent event) { 
    if(event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_DELETE && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_BACKSPACE && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_LEFT && 
     event.getNativeEvent().getKeyCode()!=KeyCodes.KEY_RIGHT){ 
      String c = event.getCharCode()+""; 
      if(RegExp.compile("[^0-9]").test(c)) 
       textbox.cancelKey(); 
    } 
} 
2

Thay TextBox của bạn với một trong hai một IntegerBox hoặc LongBox.

Đây không phải là ngữ nghĩa giống như chỉ cho phép chữ số, nhưng nó được cho là tốt hơn trong hầu hết các trường hợp sử dụng. Bạn cũng sẽ nhận được phân tích cú pháp số nguyên trong và ngoài được thực hiện miễn phí.

+0

Tuy nhiên, nó sẽ không ngăn bạn sao chép dán các giá trị không phải là số. – Stultuske

Các vấn đề liên quan