2014-04-28 2 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)에서 파생하여 간단한 해킹으로 얻을 수 있습니다. 오버라이드 된 메서드는 현재 com.vaadin.data.Container 구현에 현재 필터 문자열을 전달하는 사용자 정의 Container.Filter 구현을 반환해야합니다. 컨테이너는 데이터베이스에서 필터링 된 항목을 가져와 쿼리 결과로 채우는 작업을 담당합니다.내 예제에서 나는 오버라이드 (override) 된 메소드 de.oio.vaadin.SuggestingContainer.addFilter(Filter)

당신은 my GitHub project에서 데모를 확인할 수있는 사용자 지정 데이터베이스 필터링을 BeanItemContainer에서 파생. 불분명 한 점이 있으면 언제든지 물어보십시오.

+0

이것이 유일한 답변이므로이 대답을 수락합니다. 적어도 이것이 작동하지 않는 이유를 설명합니다. 나는 누군가가 구성 요소에 대해 유효하지 않더라도 모든 이벤트에 등록 할 수있는 것이 특히 어렵다는 것을 안다. 나는 커스텀 자바 스크립트 모듈을 작성하지 않을 것이다. 나는 PopupButton과 TextField + ListSelect의 조합을 사용하여 끝난다. 좋지는 않지만 적어도 상자 밖으로 나옵니다. – nagylzs

+1

코드 예제에 대한 링크를 사용하여 답변을 업데이트했습니다. –