2012-09-05 5 views
0
private void jTextField1KeyPressed(java.awt.event.KeyEvent evt) { 
int x=evt.getKeyCode(); 
if(x>=96&&x<=105) 
    { 
     evt.setKeyCode(8);//Here 8 is used for Backspace key to remove the numeric character entered 
    } 

Int이 코드 사용자가 jTextField에 숫자 값을 입력하지 않겠다는 것을 나타내지 만, 그렇다면 런타임시에만 제거하려고합니다. 이 코드는 내가 기대했던 것처럼 작동하지 않지만 ... Plzz Help me !!jTextField에서 런타임 중에 입력 된 문자를 지우십시오.

+3

두 가지 다른 방법으로 같은 질문을하지 마십시오 이 질문을 첫 번째 질문과 병합하십시오. 의 – Dave

+1

가능한 중복 (http://stackoverflow.com/questions/12285667/force-user-not-to-enter-numeric-entry-in-jtextfield- [* 강제로 사용자가 자바에서의 JTextField *에서 숫자 항목을 입력 할 수 없습니다] in-java). – trashgod

답변

2

당신은 실제로 KeyListeners을 피해야합니다, 그들은 당신이 궁극적으로 성취하고자하는 것에 너무 제한되어 있습니다. 필드가 시도하는 동안 필드 문서를 변경하려고 시도 할 때만 돌연변이 예외로 끝날 것입니다 문서를 변경하십시오. 당신은 정말 DocumentFilter를 사용한다

, 즉 그것의 설계 무엇입니다.

((AbstractDocument)field.getDocument()).setDocumentFilter(new DocumentFilter() { 

    @Override 
    public void insertString(FilterBypass fb, int offset, String text, AttributeSet attr) throws BadLocationException { 

     StringBuilder sb = new StringBuilder(64); 
     for (char c : text.toCharArray()) { 

      if (Character.isDigit(c)) { 

       sb.append(c); 

      } 

     } 

     fb.insertString(offset, text, attr); 

    } 

    @Override 
    public void replace(FilterBypass fb, int offset, int length, String text, AttributeSet attrs) throws BadLocationException { 

     StringBuilder sb = new StringBuilder(64); 
     for (char c : text.toCharArray()) { 

      if (Character.isDigit(c)) { 

       sb.append(c); 

      } 

     } 

     fb.replace(offset, length, sb.toString(), attrs); 

    } 

}); 

이것은 정말 기본적인 예입니다.

돌연변이 예외를 제외하고 필터는 문서/필드에 도달하기 전에 업데이트를 가로 채므로 들어오는 변경 사항이 화면에 표시되지 않으며 붙여 넣기 이벤트 또는 setText 호출도 캡처합니다.

0

그것을 할 아닐지도 모르겠지만 가장 좋은 방법은, 여기에서 매우 간단한 방법이지만.

당신은이 같은 JTextFieldpaintComponent() 메소드를 오버라이드 (override) 할 수 있습니다

JTextField textField = new JTextField(text) { 

@Override 
protected void paintComponent(Graphics grphcs) { 
    super.paintComponent(grphcs); 
    String newStr = ""; 
    for (char c : getText().toCharArray()) { 
     if (!Character.isDigit(c)) { 
      newStr += c; 
     } 
    } 
    setText(newStr); 

    } 
}; 
+0

근심 걱정하지 마십시오. 절대로, 결코 페인트 구성 요소에서 UI 구성 요소를 변경하지 마십시오. 반복되는 다시 그리기 요청으로 인해 CPU가 소모됩니다. – MadProgrammer

관련 문제