2014-03-13 2 views
0

사용자 정의 TableCell 셀 팩토러스를 만들었습니다. Decimal 입력 (숫자 & 한 점 (.) 만 허용)을 원합니다. 아래 replaceText & replaceSelection에 대한 코드가 있지만 아무것도 입력 할 수 없습니다.십진수 만 입력 한 JavaFX 사용자 정의 CellFactory

 @Override 
     public void replaceText(int start, int end, String text) { 
      if (text.matches("/^\\d*\\.?\\d*$/")) { 
       super.replaceText(start, end, text); 
      } 
     } 

     @Override 
     public void replaceSelection(String text) { 
      if (text.matches("/\\d*\\.?\\d*$/")) { 
       super.replaceSelection(text); 
      } 
     } 
    }; 

답변

2

Java 정규식은 '/'로 묶이지 않습니다. 원하는 실제 동작에 따라 다음과 같은 것이 필요합니다.

final Pattern pattern = Pattern.compile("^\\d*\\.?\\d*$"); 
final TextField tf = new TextField() { 
    @Override 
    public void replaceText(int start, int end, String text) { 
     String newText = getText().substring(0, start)+text+getText().substring(end); 
     if (pattern.matcher(newText).matches()) { 
      super.replaceText(start, end, text); 
     } 
    } 

    @Override 
    public void replaceSelection(String text) { 
     int start = getSelection().getStart(); 
     int end = getSelection().getEnd(); 
     String newText = getText().substring(0, start)+text+getText().substring(end); 
     if (pattern.matcher(newText).matches()) { 
      super.replaceSelection(text); 
     } 
    } 
}; 
0

정규식에 결함이 있습니다. 모든 것을 옵션으로 만들 때 빈 문자열과 일치시킬 수도 있습니다.

text.matches("/^\\d*\\.?\\d*$/") 

그래서 아래처럼 변경 :

text.matches("/^\\d+(\\.\\d+)?$/") 

는 여기가 ((\\.\\d+)?$) 한 후 시작 (^\\d+)에 의무적으로 자리하고 선택 점과 숫자를 의미

.

+0

아직 작동하지 않습니다. 그게 내가 아무것도 입력하지 못하게 해. –

+0

메서드에 전달되는 텍스트 대신 정규식에 대한 대체 결과를 테스트하지 않아도됩니까? String과 같은 것 newText = getText(). substring (start) + text + getText.substring (end); if (newText.matches ("...")) {super.replace (start, end, text);}' –

-1

이후에 텍스트가 바뀝니다. 텍스트를 직접 변경하지 않고 부모 (EventFilter 사용)에서 KeyEvent.KEY_PRESSED를 수신하는 것이 좋습니다.

이벤트가 발생하고 숫자인지 아닌지를 확인하십시오. 입력에 표시하지 않으려는 경우 이벤트를 사용합니다.

+0

이것은 좋은 접근 방법이 아닙니다. 각 키 스트로크마다가 아니라 전체 텍스트를 볼 필요가 있습니다. "123.456.789"와 같은 잘못된 입력을 방지하기 위해이 방법을 어떻게 사용 하시겠습니까? ctrl-C 및 ctrl-V 및 기타 미리 정의 된 키 조합을 방해하는 것은 어떻습니까? OP가 제안한 메커니즘은 어쨌든 "나중에 텍스트를 대체"하지 않으며, 유효하지 않은 경우 변경을 거부합니다. –

+0

@James_D, 처리기에서 전체 텍스트를 얻을 수 있으므로 아무런 문제가 나타나지 않습니다. 또한 Ctrl + 키 입력을 필터링 할 수 있습니다. 키 이벤트에 있습니다. 필자는 개인적으로 JavaFX 구현에 의존하지 않기 때문에이 방법을 선호합니다. TextField는 블랙 박스이며 TextField API가 변경되면 변경되지 않습니다. – zenbeni

+0

일반적으로 동일한 이유로 서브 클래 싱하지 않는 것이 좋지만이 경우에는 복제해야 할 엄청난 양의 기능이 있습니다. 사용자가 텍스트 필드에 텍스트를 붙여 넣을 수있는 기본 제공 컨텍스트 메뉴는 어떻게 처리합니까? 저기 키 입력이 필요 없어요. –

관련 문제