2012-10-30 33 views
1

對於文本字段,我可以檢查用戶輸入多少個字符,例如 -驗證器在窗體的組合框與先進的佈局

Field f; 
... 
f.addValidator(new StringLengthValidator("WARNING MESSAGE HERE", 6, 20, false)); 
... 

如果數量不在範圍內,則發出警告。 對於數字字段,我可以檢查的類型,例如 -

... 
    f.addValidator(new Validator() { 
     public boolean isValid(Object value) { 
      try { 
      float f = Float.parseFloat((String) value); 
      return true; 
      } catch (Exception e) { 
      f.getWindow().showNotification("WARNING MESSAGE HERE"); 
      f.setValue(0);        
      return false; 
      } 
     } 
     public void validate(Object value) 
      throws InvalidValueException { 
     } 
    }); 
... 

如果我需要一個СomboBox?我指出 -

final ComboBox mode = new ComboBox("..."); 
... 
if("someProperty".equals(propertyId)) {     
    f = mode;      
} 
... 
f.setRequired(true);     
f.setRequiredError("WARNING MESSAGE HERE");     

... 

留空它,沒有警告,有一個提交表單併發送到服務器。需要組合框什麼驗證?

+0

原則,夠本 - '... 對象ID = mode.addItem( 「某些價值」); ... mode.setValue(ID); mode.setNullSelectionAllowed(false); mode.setNewItemsAllowed(false); ...' 但它無法正常工作。 它似乎是做這個檢查的形式。 –

+1

爲了把事情說清楚:價值變動之後你的組合框未通過驗證,而不是提交後? – nexus

+0

感謝您的回覆,nexus!恩,那就對了。如果在更改後立即檢查ComboBox,那將會很好。據我所知,我需要寫聽衆。作爲備選。 –

回答

2

你要找的是立即回調到服務器的用戶後,改變一切。

// Fire value changes immediately when the field loses focus 
combobox.setImmediate(true); 

對於用戶不必直到他們承諾迫不及待地想驗證或做別的什麼需要與服務器進行交互。

+0

謝謝,nexus! –

1

我想你應該明確地調用validate()方法:

/** 
* Checks the validity of the Validatable by validating the field with all 
* attached validators except when the field is empty. An empty field is 
* invalid if it is required and valid otherwise. 
* 
* The "required" validation is a built-in validation feature. If the field 
* is required, but empty, validation will throw an EmptyValueException with 
* the error message set with setRequiredError(). 
* 
* @see com.vaadin.data.Validatable#validate() 
*/ 
public void validate() throws Validator.InvalidValueException { 

    if (isEmpty()) { 
     if (isRequired()) { 
      throw new Validator.EmptyValueException(requiredError); 
     } else { 
      return; 
     } 
    } 

    // If there is no validator, there can not be any errors 
    if (validators == null) { 
     return; 
    } 
... 

默認形式進行驗證:

/** 
* Checks the validity of the validatable. 
* 
* @see com.vaadin.data.Validatable#validate() 
*/ 
@Override 
public void validate() throws InvalidValueException { 
    super.validate(); 
    for (final Iterator<Object> i = propertyIds.iterator(); i.hasNext();) { 
     (fields.get(i.next())).validate(); 
    } 
} 
+0

感謝您的回覆,Renat Gilmanov! 是的,我打電話'方法f.setRequired(真);',但它不工作。好吧,我會盡量按照你的說法,謝謝! –