사용자 정의 컨트롤에 대한 사용자 정의 MultipleSelectionModel
을 만들려고하면서 내가 만들고있는 중 ListView
의 기본 선택 모델이 어떻게 작동 하는지를보기 시작했고 확실하지 않은 것을 발견했습니다. 이것은 SelectionMode
이 MULTIPLE
으로 설정되고 ctrl-click을 사용하는 경우에 특히 발생합니다.ListView의 선택 모델이 다중 선택 모드에서 항목 선택을 취소하지 않습니까?
설정하려면 간단히 ListView
을 만들고 약 20 개의 항목 (항목의 유형과 상관 없음)을 추가하십시오. 에만 초점을 맞추고 선택된 인덱스를 제거 delete
를 눌러 모든 현재 선택한 항목을 제거 shift+delete
을 눌러
listView.addEventHandler(KeyEvent.KEY_PRESSED, event -> {
if (event.getCode() == KeyCode.DELETE) {
event.consume();
if (event.isShiftDown()) {
ObservableList<Object> selectedItems = listView.getSelectionModel().getSelectedItems();
listView.getItems().removeAll(selectedItems);
} else {
int selectedIndex = listView.getSelectionModel().getSelectedIndex();
if (selectedIndex >= 0) {
listView.getItems().remove(selectedIndex);
}
}
}
});
당신이 볼 수 있듯이, 그런 다음 나는 다음과 같은 EventHandler
을 추가했다.
이제 항목을 클릭하면 선택됩니다. 그런 다음 ctrl-click
같은 항목을 선택 취소하고 삭제를 누르면 아무 것도 선택되지 않아 항목이 제거되지 않습니다.
한 번에 여러 항목을 선택하는 것으로 전환하십시오. 선택한 마지막 항목은 "집중된"항목이되고 삭제를 누르면 해당 항목이 삭제됩니다. 말이된다. 그러나 내가 ctrl-click
"초점을 맞춘"항목을 선택 취소하고 을 삭제하면 이전 항목이 아닌 항목이 삭제됩니다 ("초점"을 선택했을 것임). 위와 동일한 절차를 수행하지만 delete
대신 shift+delete
을 누르면이 선택 해제 된 항목을 제외한 모든 항목 (여전히 선택된 항목) 이 제거됩니다.
은 내가이에서 수집하는 것은 선택 모델의 getSelectedItems()
또는 getSelectedIndices()
메소드에 의해 반환되는 ObservableList
가 제대로 업데이트되지만 selectedIndexProperty()
및 selectedItemProperty()
특성이 아니라는 것이다. 사실 이러한 속성을 관찰하여 변경 사항을 확인한 것으로 보입니다. 하지만이 동작을 지정하는 Javadoc에는 아무것도 표시되지 않습니다. 하지만 어쩌면 내가 뭔가를 놓친 것 같아.
이제 실제 질문 : 이러한 UI 요소에 대한 정상적인 동작입니까, 아니면 버그로 간주 될까요?
참고 : 나는 좀 더 내가 this question/answer 건너 온 둘러보고 후 편집
자바 9.0.1와이 테스트되었다. 내 대답을 제외하고 내 대답을 나타납니다 :
selectedItemProperty 다중 행 선택을 반영해야합니까? SelectionMode.SINGLE과 함께 사용 되었기 때문에 사용할 수 없습니다.
하지만 SelectonModel.selectedIndexProperty()
를위한 JavaDoc 말한다 (추가 강조) :
선택한 인덱스 속성이 가장 일반적으로 선택 모델은 단일 선택을 할 수 있지만 다중 선택 모드에서 때 동일하게 적용 할 때 사용. 이 모드에서 선택한 인덱스는 항상 마지막으로 선택한 항목을 나타냅니다.
Javadoc의 의미를 완전히 이해하지 못했습니까?
SelectionModel은 불완전 (리드/앵커 의미없는 누락), 과장된 (의미 적 배킹이없는 탐색 방법), 과도하게 분리 된 (포커스와 선택), 지나치게 지정된 상속 (단일 vs. multiple) .. 여기서는 첫 번째로 실행됩니다 : selectedIndex는 리드의 역할을 할 수 있습니다! = -1이지만 선택되지 않았습니다. – kleopatra