2011-01-18 7 views
3

저는 화폐 값, 날짜, SSN 등과 같은 것들을 위해 GWT TextInputCell로 입력을 제한하려고합니다. 정규 표현식 (이상적으로)을 사용하여 필드에 입력 할 수있는 문자를 제한하고 싶습니다. 이 작업을 수행하는 유일한 방법은 TextInputCell에서 onBrowserEvent 메서드를 재정의하는 것이지만 작업 할 수는 없다고 생각합니다.입력을 GWT의 TextInputCell로 어떻게 제한 할 수 있습니까?

입력 셀을 마스크하는 가장 좋은 방법은 무엇입니까?

답변

4

preventDefault 방법을 갖는 NativeEvent을 수신하는 방법. 네이티브 이벤트의 getKeyCode이 차단하려는 문자를 반환 할 때마다 해당 메서드 preventDefault을 호출하려고합니다.

KeyCodes 클래스도 참조하십시오.이 키는 특수 키를 테스트 할 때 유용합니다. 그래서 여기

+0

우수한

public class MaskedTextInputCell extends KeyPressableTextInputCell { public interface ValidationStrategy { public boolean matches(String valueToCheck); } private ValidationStrategy overallFormValidationStrategy; private ValidationStrategy validKeystrokeValidationStrategy; public MaskedTextInputCell(ValidationStrategy overallFormValidationStrategy, ValidationStrategy validKeystrokeValidationStrategy) { this.overallFormValidationStrategy = overallFormValidationStrategy; this.validKeystrokeValidationStrategy = validKeystrokeValidationStrategy; } @Override public void onBrowserEvent(Element parent, String value, Object key, NativeEvent event, ValueUpdater<String> valueUpdater) { super.onBrowserEvent(parent, value, key, event, valueUpdater); if ("keypress".equals(event.getType())) { String keystroke = String.valueOf((char) event.getCharCode()); handleInvalidKeystroke(keystroke, event); } else if ("blur".equals(event.getType()) || "keyup".equals(event.getType())) { String valueInInputElement = getInputElement(parent).getValue(); handleInvalidOverallForm(valueInInputElement); } } protected void handleInvalidOverallForm(String valueOfEntireField) { if (!overallFormValidationStrategy.matches(valueOfEntireField)) { //You could fire an event here to turn the cell red... GWT.log("Invalid form."); } } protected void handleInvalidKeystroke(String keystroke, NativeEvent event) { if (!validKeystrokeValidationStrategy.matches(keystroke)) { GWT.log("Invalid keystroke."); event.preventDefault(); } } } 

나는 다음 ValidationStrategy의 정규 표현식 구현을 만들었습니다! 마침내 keyup/keydown 이벤트 캡처 및 트리밍 작업을 수행했지만 preventDefault가 훨씬 잘 작동합니다! 제 궁극적 인 해결책을 별도의 답변으로 게시하겠습니다 만, 귀하의 의견을 받아 들일 것입니다. –

2

은 (다윗의 좋은 의견에 따라) 내 솔루션입니다 :

첫째, 기본 keypress 이벤트를 처리 할 수있는 TextInputCell의 제한이있다, 그래서 나는 거의 정확한을 만들어야했습니다 클래스 복사본을 만들고 생성자에 keypress 이벤트 유형을 추가합니다. 여기서 셀은 슈퍼 생성자에 대해 처리 할 수있는 이벤트 유형을 전달합니다. 이 클래스를 KeyPressableTextInputCell이라고합시다. Why isn't the keypress event being sent to GWT's TextInputCell.onBrowserEvent() method?

그런 다음 onBrowserEvent() 메서드를 재정의하고 잘못된 키 입력을 방지하고 입력란의 전체 양식을 확인합니다. 예를 들어, 유효한 통화 키 입력은 0-9 및 소수점입니다. 전체 양식은 하나의 소수점 만있는 숫자 여야합니다. 이 두 가지 검사는 모두 ValidationStrategy이라고하는 전략 인터페이스를 사용하여 수행되며 MaskedTextInputCell에 직접 입력됩니다. 나는 돈이 필드를 만들려면이 같은 작업을 수행 할 수 있습니다, 지금

public class RegularExpressionValidationStrategy implements MaskedTextInputCell.ValidationStrategy { 
    private String regularExpression; 
    public RegularExpressionValidationStrategy(String regularExpression) { 
     this.regularExpression = regularExpression; 
    } 
    @Override 
    public boolean matches(String valueToCheck) { 
     return valueToCheck.matches(regularExpression); 
    } 
} 

:

public class MonetaryTextInputCell extends MaskedTextInputCell { 
    public MonetaryTextInputCell() { 
     super(new RegularExpressionValidationStrategy("[0-9.]"), 
       new RegularExpressionValidationStrategy("^[0-9.][0-9]*[0-9.]?[0-9]*$")); 
    } 
} 
+0

SHIFT + 임의 키와 같은 조합 키를 어떻게 확인합니까?> –

관련 문제