2017-11-02 6 views
1

사용자 정의 컨트롤에 대한 사용자 정의 MultipleSelectionModel을 만들려고하면서 내가 만들고있는 중 ListView의 기본 선택 모델이 어떻게 작동 하는지를보기 시작했고 확실하지 않은 것을 발견했습니다. 이것은 SelectionModeMULTIPLE으로 설정되고 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의 의미를 완전히 이해하지 못했습니까?

+0

SelectionModel은 불완전 (리드/앵커 의미없는 누락), 과장된 (의미 적 배킹이없는 탐색 방법), 과도하게 분리 된 (포커스와 선택), 지나치게 지정된 상속 (단일 vs. multiple) .. 여기서는 첫 번째로 실행됩니다 : selectedIndex는 리드의 역할을 할 수 있습니다! = -1이지만 선택되지 않았습니다. – kleopatra

답변

-1

항목이 선택되고 선택 해제되는 방식은보기 자체의 속성입니다.보기 내에서이 목록이 유지되는 방식에 따라 다르며이보기는 동일한보기의 forcus 순서와 다를 수 있습니다. 하나의 제어 장치 내부에는 의도가 없었습니다. 이러한 문제를 다루는 것은 View 자체가 외부 컨트롤러를 청취하는 것이 아니라 관심사입니다. 컨트롤러는보기가 표시, 선택, 숨기기 및이 경우 여러 객체를 주문하는 방식에 관여하지 않습니다.

+0

동의합니다 ... 주로. 문제는 내가 본 것을 기반으로 선택 모델이 뷰 **와 자체 **에서 모두 일치하지 않는다는 것입니다. 선택한 항목/색인 _list_을 기반으로 선택 항목을 결정할 수 있지만 _properties_는 목록에없는 항목이 선택되었음을 표시 할 수 있습니다 _. 나는 이것이 문제라고 생각한다. 'MultipleSelectionModel'클래스의 "select"메소드에 대한 Javadoc을 살펴보십시오. 많은 사람들이 "마지막 유효 색인은 선택된 항목/색인이 될 것"과 같은 것을 말합니다. 인덱스 1 ~ 8을 선택하면 인덱스 8이 "집중"선택이됩니다. (계속되는). – Slaw

+0

(계속) 그러나 인덱스가 선택 해제되고 _it가 "포커스 된 인덱스"와 동일한 인덱스 인 경우 속성에서 인덱스를 다른 선택된 인덱스 중 하나로 변경해야한다는 요구 사항은 어디에서 볼 수 있습니까? 나는 이것이 계급 계약의 실패라고 생각한다. Javadoc은 그 재산이 "항상 마지막 선택을 대표 할 것"이라고 덧붙였다. 지금, 나는 그것이 "또는 unmade"를 말하지 않는다는 것을 안다. 그러나 나는 그것이 너무 문자적인 것으로 생각한다. – Slaw

+0

@Slaw는 selectedIndex를 leadIndex로 생각하며 선택 취소시 변경되지 않습니다. – kleopatra