2009-05-20 47 views
8

我有一個ICellModifier似乎工作正常的TableViewer。但是,我在其中一個單元編輯器上設置了ICellEditorValidator,但我無法按照自己的喜好行事。這裏是我的縮寫代碼:如何顯示ICellEditorValidator檢測到的驗證錯誤?

cellEditors[1] = new TextCellEditor(table); 
cellEditors[1].setValidator(new ICellEditorValidator() { 
    public String isValid(Object value) { 
     try { 
      Integer.parseInt((String) value); 
      return null; 
     } catch(NumberFormatException e) { 
      return "Not a valid integer"; 
     } 
    } 
}); 

它大多工作正常。但是,有兩個問題:

  1. 細胞 修改的modify方法收到null作爲新 值,如果驗證返回 錯誤。我可以編寫代碼來處理這個問題, 但它似乎不正確。空 可能是一個有效的值,例如, 如果用戶選擇背景 顏色,他們選擇透明。 (這是一個普遍問題,並非特定於此示例。)
  2. 驗證器的錯誤消息是 從不顯示給用戶。這個 是個大問題。如果 上一個值無效,我還可以 添加ICellEditorListener,並且 將顯示 applyEditorValue方法中的對話框。這是 「適當」的方式來做到這一點?

順便說一下,由於我無法控制的原因,我僅限於Eclipse 3.0框架。

回答

9

您可以將監聽器添加到您的編輯:

cellEditors[1].addListener(
     public void applyEditorValue() {      
      page.setErrorMessage(null); 
     } 

     public void cancelEditor() { 
      page.setErrorMessage(null);     
     } 

     public void editorValueChanged(boolean oldValidState, 
       boolean newValidState) {      
      page.setErrorMessage(editor.getErrorMessage());         
     } 

隨着是您當前FormPage,這將顯示的errorMessage給用戶。

5

關於第二個問題,驗證程序的方法isValid返回的字符串成爲擁有該驗證程序的CellEditor的錯誤消息。您可以用CellEditor.getErrorMessage檢索該消息。

在我看來,顯示錯誤信息的最簡單方法是通過ICellEditorListener,正如Sven在上面所述。也許關於這個監聽器的棘手問題是單元編輯器沒有作爲參數傳遞給它的任何方法,所以假設監聽器知道哪個單元編輯器正在與之交談。

如果您想要對話框,首選項頁面或任何實現ICellEditorListener接口的對象,您必須確保它知道正在編輯的單元格編輯器。

但是,如果它是實現接口的單元編輯器本身,它應該有一種方法來正確地將錯誤信息載入對話框,首選頁面或其他任何東西。這是Scott正在尋找的currentForm page

如果您使用EditingSupport,值得注意的最後一件事是當ICellEditorValidator.isValue返回錯誤消息時,傳遞給EditingSupport.setValue方法的值爲空。不要忘記檢查一下。