2013-07-30 7 views
3

테이블 편집 모드로 들어가면 사용자가 유효성 검사 제약 조건을 벗어나면 즉시 데이터 유효성 검사 감탄 아이콘 (!)을 표시하려고합니다.테이블 필드에 유효성 검사 아이콘이 표시되지 않음

첫째, 메모의 몇 가지 : 내가 만약 angel 7 사용하고

  • , 그래서 콩 검증 부가 기능은 슬프게도 작동하지 않습니다.
  • 데이터 유효성 검사가 의도 한대로 작동합니다.

이제 Person Bean을 내부에 유지하기 위해 BeanItemContainer를 사용하고있는 완벽하게 작동하는 테이블이 있습니다.

다음과
table.setContainerDataSource(buildContainer()); 
table.setTableFieldFactory(new TableFieldFactory() { 
    @Override 
    public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) { 
     TextField field = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, 
       uiContext); 
     field.setImmediate(true); 
     if (propertyId.equals("firstName")) { 
      field.addValidator(new BeanValidator(Person.class, "firstName")); 
     } 
     return field; 
    } 
}); 

사람 콩이 보이는 :

테이블과 TableFieldFactory에 대한 코드는 다음과 같이 보입니다

public class Person { 

    @Size(min = 5, max = 50) 
    private String firstName; 

    ... setters + getters... 
} 

문제는 그 나는 firstName을 필드에 뭔가를 입력 할 때 필드를 입력하거나 블러/언 포커스를 누르면 아무런 오류 표시가 나타나지 않습니다. 필드를 마우스로 움직여 뭔가 잘못되었다는 것을 알아야합니다. 필드가 무효 때

내 질문은 두 접혀

...

  1. 어떻게 느낌표 아이콘이 표시합니까?
  2. 없이, 5 개 문자에서 즉, 즉시 입력 한 후 ( 을 잘못된 필드 (아이콘 표시)에서 즉각적인 응답을 얻을 수있는 방법이 있나요 (이것은 표 하지입니다 일반 텍스트 필드 작동)질문에 필드를 입력하거나 흐리게/펼치지 않아야 함).

두 가지 질문에 답변 할 수 있다면 좋겠습니까? =)

미리 감사드립니다.

답변

3
  1. 캡션, 필수 표시 등 (빨간색 별표)와 - 가장 중요하게 여기 - 오류 표시 (느낌표) 실제로 구성 요소를 포함하는 레이아웃에 의해 제공됩니다, 하지 구성 요소 자체. 편집 가능한 구성 요소가 표에 표시되면 이 표시되지 않고 레이아웃이 표시되므로 오류 표시기가 표시되지 않습니다.

    이 원을 정사각형으로 만들려는 경우 편집 가능한 입력란의 래퍼로 CustomField를 만드는 방법을 살펴보고 해당 CustomField 내에 래핑 된/위임 필드가 유효하지 않은 경우 오류 표시기를 표시합니다. 나는 이것을 시도하지 않았다. 나는 테이블에서 편집 가능한 필드를 전혀 사용하지 않았지만 그렇게하기는 쉽다.

  2. TextChangeListener을 FieldFactory 필드에 추가하고 수신기에서 field.validate()를 호출하십시오. 그러나 field.getValue() 값은 보통 으로 변경되지 않습니다. 흐림/초점 해제 할 때까지는 유효성 검사기가 이전 값을 확인합니다. field.setValue (event.getText())를 호출합니다. 자세한 내용은 Vaadin 포럼의 this post을 참조하십시오.

이것은 유효성 검사 래퍼를 의미하는 것입니다. 사용하지 않으려 고 시도한 것입니다. initComponent는 FormLayout 내에 필드를 반환하기 만하면 찾고있는 아이콘을 얻을 수있다. (당신은 내가 안좋다하지만 얼핏이 충분히있을 수 있습니다 제안보다 위임 ValidatingWrapper에서 더 많은 방법을 위임해야 할 수도 있습니다.)

당신은 다음 tableFieldFactory의 필드를 감싸는 것 (두 번째 코드 블록)

public class ValidatingWrapper<T> extends CustomField<T> { 

    private static final long serialVersionUID = 9208404294767862319L; 
    protected Field<T> delegate; 

    public ValidatingWrapper(final Field<T> delegate) { 
    this.delegate = delegate; 

    if (delegate instanceof TextField) { 
     final TextField textField = (TextField) delegate; 
     textField.setTextChangeEventMode(AbstractTextField.TextChangeEventMode.TIMEOUT); 
     textField.setTextChangeTimeout(200); 

     textField.addTextChangeListener(new FieldEvents.TextChangeListener() { 
     @Override 
     public void textChange(FieldEvents.TextChangeEvent event) { 
      textField.setValue(event.getText()); 
      textField.validate(); 
     } 
     }); 
    } 
    } 

    @Override 
    public Class<? extends T> getType() { 
    return delegate.getType(); 
    } 

    @Override 
    protected Component initContent() { 
    return new FormLayout(delegate); 
    } 


    @Override 
    public Property getPropertyDataSource() { 
    return delegate.getPropertyDataSource(); 
    } 

    @Override 
    public void setPropertyDataSource(Property newDataSource) { 
    delegate.setPropertyDataSource(newDataSource); 
    } 

} 
나는 TableFieldFactory의 createField 방법에서이 작업을 수행하기 위해 노력하고 있기 때문에
table.setContainerDataSource(buildContainer()); 
table.setTableFieldFactory(new TableFieldFactory() { 
    @Override 
    public Field createField(Container container, Object itemId, Object propertyId, Component uiContext) { 
    TextField field = (TextField) DefaultFieldFactory.get().createField(container, itemId, propertyId, 
     uiContext); 
    field.setImmediate(true); 
    if (propertyId.equals("firstName")) { 
     field.addValidator(new BeanValidator(Person.class, "firstName")); 
    } 
    return ValidatingWrapper(field); 
    } 
}); 
+0

나는, 래퍼를 만드는 방법에 대한 확실하지 않다. 어떤 충고? – Roger

+0

@Roger 편집 ... –

+0

FormLayout에 익숙하지 않았습니다. 멋지게 설명했다! 잘 작동하는 것 같습니다. TextChange 메소드의 호출은 경계를 벗어날 때 InvalidValueException을 던집니다. 나는 내가해야 할 일은 그 실수를 잡아서 모든 것이 잘되어야한다는 것입니다. 고마워, 찰스! – Roger

관련 문제