2014-10-08 9 views
2

현재 모든 텍스트 필드에서 DocumentListener를 사용하여 사용자 입력의 유효성을 검사하고 있습니다.하지만 내 자신을 너무 많이 반복하기 때문에 똑똑한 방법이 필요하다고 생각합니다.Java DocumentListener를 사용하는 더 똑똑한 방법

더 똑똑한 방법이 있습니까?

nameJTextField.getDocument().addDocumentListener(new DocumentListener() { 

     @Override 
     public void insertUpdate(DocumentEvent e) { 
      validateName(nameJTextField.getText()); 
     } 

     @Override 
     public void removeUpdate(DocumentEvent e) { 
      validateName(nameJTextField.getText()); 
     } 

     @Override 
     public void changedUpdate(DocumentEvent e) { 

     } 

     private void validateName(String name) { 
      if (name.matches("^[A-ZÆØÅa-zæøå0-9]{2,40}$")) { 
       errorNameJLabel.setText(""); 
      } else { 
       errorNameJLabel.setText("Min 2 and max 40 letters and numbers"); 
      } 
     } 
    }); 
+0

을 내가 말했고 알았던 것처럼, 이것은 이제까지 가장 현명한 길다. –

답변

1

내장 자바에 없습니다. 나는 모든 DocumentListeners와 많이 할 정확히이 작업을 수행 할 수, 그래서 난 내 자신의 클래스를 만든 :

https://github.com/MattPutnam/Common/blob/master/src/common/swing/DocumentAdapter.java

복사/붙여 넣기하시기 바랍니다.

+0

나는 Java에 대해 상당히 익숙하지 않으므로 내 질문에 명백한 요구가있는 것처럼 보일 수 있지만 어떻게 사용합니까? –

+1

Normal처럼 DocumentListener로 추가 한 다음 documentChanged 메서드를 재정의하십시오. – MattPutnam

+0

설계 한 클래스로 접근 방식을 사용하기로 결정했습니다. 그것은 간단하고 빠릅니다. 장기적으로, 나는 @camickr의 해결책을 시도하고 구현할 것이다. –

3

내가 너무 내 자신을 반복하고 있기 때문이다.

는 validateName은 (...) 메소드의 DocumentListener에 정의되어야한다
  1. 텍스트를 사용하지 마십시오

당신이 어떤 텍스트 필드에 추가 할 수있는 일반의 DocumentListener 만들기 텍스트를 가져 오기위한 필드. 대신 문서에서 텍스트를 가져올 수 있습니다. DocumentEvent에는 Document에 대한 참조가 있습니다.

또한 changedUpdate (...) 메소드에서 유효성 검사를 수행하지 않을 것입니다. 이 메소드는, JTextPane 또는 JEditorPane를 사용하는 경우에 텍스트의 속성 (폰트, 칼라 등)의 변경에 대해서만 사용됩니다.

자세한 내용을 알지 못하면 구체적인 답변을하기가 어렵습니다.

+0

나는 그것을 바꿨다. 그래서 t hat DocumentListener 안에 유효성 검사 메서드가 있습니다. 그래서 좀 더 일반적인 클래스를 만들 수 있습니다. 아마 유효성 검사의 각 유형에 대해, 그리고 문자열 검증과 같은 DocumentListener의 객체를 만들 수 있습니까? –

+0

정확히, 클래스를보다 일반적인 것으로 만들기 위해 매개 변수를 전달해야 할 수도 있습니다. 예를 들어, 최대 문자열 길이. 또한 사용할 수있는'JFormattedTextField'를 볼 수 있습니다. 또한 DocumentFilter는 문서가 업데이트되기 전에 유효성 검사를 수행하므로 원하지 않는 데이터가 문서에 입력되는 것을 방지 할 수 있으므로 더 나은 방법 일 수 있습니다. – camickr

1

오류 메시지를 다른 위치에 저장하려는 경우에는 문제가 없습니다.

나는 개인적으로 JFormattedTextField (또는 적어도 포이즌 버전)을 사용하고 싶습니다.

  • 형식/구문 분석 입력에 완벽한 재사용 java.text.Format을 만들 수 있습니다.
  • 입력이 유효하지 않은 경우 배경색을 변경하여 사용자에게 잘못된 필드를 분명히합니다. 여러 필드가 동시에 부정확 할 수있는 양식을 만들 때 편리합니다.
  • 유효한 입력이 입력 될 때만 이벤트 (value 속성의 경우 PropertyChangeEvents)가 표시됩니다. 유효하지 않은 입력으로 인해 이벤트가 발생하지 않습니다. 예. 양식에 제출 단추를 사용하십시오.

숫자에 대한 예는 this question에서 찾을 수 있습니다.

0

그냥 나무 상자의 DocumentListener를 확장하고 모두의 DocumentListener 방법을 구현하는 인터페이스 :

@FunctionalInterface 
public interface SimpleDocumentListener extends DocumentListener { 
    void update(DocumentEvent e); 

    @Override 
    default void insertUpdate(DocumentEvent e) { 
     update(e); 
    } 
    @Override 
    default void removeUpdate(DocumentEvent e) { 
     update(e); 
    } 
    @Override 
    default void changedUpdate(DocumentEvent e) { 
     update(e); 
    } 
} 

다음 :

jTextField.getDocument().addDocumentListener(new SimpleDocumentListener() { 
    @Override 
    public void update(DocumentEvent e) { 
     // Your code here 
    } 
}); 

또는 심지어 람다 식 사용할 수 있습니다까지

jTextField.getDocument().addDocumentListener((SimpleDocumentListener) e -> { 
    // Your code here 
});