2016-08-16 5 views
0

자동 편집 기능이있는 간단한 편집 가능한 ComboBox를 작성하고 있습니다. 내부 TextField의 내용에 따라 ComboBox의 내용을 필터링하고 싶습니다.
나는 그럭저럭 효과를 낼 수 있었지만 TextField에서 문자를 삭제할 때 자동 완성 논리를 다시 적용 할 때 문제가 발생했습니다.JavaFX ComboBox 키 이벤트시 TextField 내용

내가 본 것으로부터, 키를 눌렀을 때 텍스트 필드의 내용에는 아직 추가 된 문자가 포함되어 있지 않습니다.
그래서 TextField의 내용을 시뮬레이션하기 위해 KeyEvent의 문자열 버전을 추가하는 간단한 로직을 만들었습니다. 인 (

일부 문자를 입력 할 때,하지만 키를 백 스페이스를 누르거나 삭제할 때이 잘 작동
// In constructor 
cmb.getEditor().setOnKeyPressed(this::handleOnKeyPressed); 

public void handleOnKeyPressed(KeyEvent e) { 
    String text = comboBox.getEditor().getText() + e.getText(); 
    // Filtering logic based on text 
} 

, 그것은 작동하지 않습니다 : 나는 내 논리 기본적으로
을 적용 할 전체 텍스트를 가질 필요가이 beacuse했다 코드 당 명백 함).
그래서 내가 볼 수있는 해결책은 캐럿 위치를 확인하고 캐럿 위치를 기반으로 백 스페이스/삭제 문자 제거를 시뮬레이트하는 것입니다. 그러나 이것은 상당히 성가신 일입니다 ...
따라서이 일을하는 더 깔끔한 방법이 없는지 궁금합니다. 전체 텍스트를 직접 가져올 수 있습니까? 처음에는 변경 리스너를 추가하려고 생각했지만 TextField에서는 불가능한 것 같습니다.

아이디어가 있으십니까?
감사합니다.

+0

을)'의 TextField. – ItachiUchiha

+0

예, 실제로 아래 답변이 유효합니다! – Xendar

답변

1

에디터 필드 안의 텍스트가 변경 될 때마다 트리거됩니다 편집기의 textProperty,에 ChangeListener<String>을 추가 할 수 있습니다 : 당신은`textProperty (에 리스너를 추가 할 수 있습니다

cmb.getEditor().textProperty().addListener(this::handleComboTextChange); 

... 

public void handleComboTextChange(ObservableValue<? extends String> o, String oldText, String newText) { 
    ... 
} 
+0

오, 이런, 너무 바보 같아서 ... 물론 청취자를 위해 텍스트 속성을 살펴 봐야합니다 ... 고마워요! – Xendar

관련 문제