2014-04-28 50 views
4

我有一個應用程序,它有各種數據庫記錄的編輯器。這些記錄是相互引用的。我正在開發一個基於組合框一個新的自定義數據感知組件:Vaadin 7組合框 - 如何填充和下拉文本輸入?

public abstract class CustomDbLookupField<T> extends CustomField<T> implements Field<T> 

下面是我想:

  • 組件看起來像一個組合框(我可以很容易地做到這一點)
  • 當對應字段值的行ID,那麼組件顯示引用記錄的文字表述(我也能做到這一點)
  • 當用戶開始在組合框中鍵入文本,然後我要搜索數據庫中的關鍵字,並填充組合與這些項目框,讓再
  • 下拉他的組合框,等他從結果

我似乎無法做最後的兩個部分進行選擇。我想要將偵聽器綁定到「鍵入組合框的文本」事件中,但我找不到任何方法。此外,我不知道如何獲取剛輸入的文字,我想這一點:

cmb.addListener(com.vaadin.event.FieldEvents.TextChangeEvent.class,target, method); 

,但我不知道該怎麼傳遞的參數指標和方法。

回答

7

這是一個很好的問題,也是一個無法用幾句話回答的問題。我會盡量給你一個簡短的答案,並會在稍後嘗試詳細闡述。我目前正在黑客舉一個小例子來演示你想要實現的功能。但我需要更多時間。只要我有一些結果,我會盡快更新我的答案。

在此之前,您的問題的簡短答案是,如果您在組件上註冊TextChangeEvents的偵聽器,則需要有人實際觸發這些事件。這通常發生在客戶端,例如在TextField中。當你從CustomField派生時,你仍然需要提供一些客戶端實現。 CustomField只是您的自定義字段實現的基本實現,沒有大量準備好的客戶端功能。所以,就你的情況而言,TextChangeEvents的監聽器實際上永遠不會被調用。

您可以通過從ComboBox派生來簡化操作。在ComboBox中輸入文本時,ComboBox已經內置了對前綴過濾的支持。實際的過濾器功能在作爲ComboBox的數據源的Container中實現。 訣竅是覆蓋受保護的方法ComboBox#getOptionsWithFilter(boolean)以在數據庫中進行過濾並使用自定義的Container實現,該實現從數據庫提供過濾的項目。

更新:如所承諾的,我寫了一個小的演示應用程序,它展示瞭如何編寫自定義組合框,其項目被動態地從數據庫中填充作爲文本的用戶類型。這可以通過從ComboBox和覆蓋方法com.vaadin.ui.ComboBox.buildFilter(String, FilteringMode)得到簡單的破解來實現。重寫的方法將需要返回一個自定義的Container.Filter實現,該實現簡單地將當前過濾器字符串傳遞到自定義com.vaadin.data.Container實現。然後,容器負責從數據庫中提取過濾的項目,並使用查詢結果自行填充。在我的例子中,我從BeanItemContainer派生出來,在那裏我使用重寫的方法進行自定義數據庫過濾de.oio.vaadin.SuggestingContainer.addFilter(Filter)

您可以在my GitHub project查看演示。不要猶豫,詢問有沒有不清楚的地方。

+0

我接受這個答案,因爲這是唯一的答案,至少這解釋了爲什麼它不起作用。我發現特別令人不安的是,任何人都可以註冊任何事件,即使它對組件無效。我不會編寫自定義的Javascript模塊。我最終使用PopupButton和TextField + ListSelect的組合。看起來不太好,但至少可以開箱即用。 – nagylzs

+1

我通過指向代碼示例的鏈接更新了我的答案。 –