2017-04-13 13 views
1

JFace의 CheckBoxTreeViewer를 사용하고 있습니다.CheckBoxTreeViewer에서 항목을 선택/선택 취소하는 것을 중지하는 방법은 무엇입니까?

사용자가 항목의 텍스트를 클릭하면 트리 및 동일한 문서의 프레젠테이션 다른 곳에서 항목이 선택됩니다. 이것은 바람직한 행동입니다.

사용자가 확인란을 클릭하기 만하면 트리 항목이 적어도 Windows 및 Mac 구현에서 선택됩니다. 위의 원하는 동작 때문에 차례로 현재 선택 영역이 바뀝니다.

사용자가 현재 선택 항목을 바꾸지 않고 트리의 항목을 켜거나 끌 수 있기를 바랍니다. check/unchecking이 트리 항목을 선택하지 않도록 CheckBoxTreeViewer를 구성하는 방법이 있습니까? 아니면 그 동작은 OS에 특정한 룩앤필의 일부일까요?

+1

, SWT.MULTI '), 체크 상자를 클릭해도 항목이 선택되지 않고 이전 선택 사항이 유지됩니다. 설명 된 동작을 보여주는 [MCVE] (https://stackoverflow.com/help/mcve)가 있습니까? –

+0

@LorisSecuro -이 예제를 시도해보고 SWT.MULTI를 추가하지 않고도 설명하는 동작을 얻습니다. 매우 유용한 관찰에 감사드립니다. 당신의 본보기가 충분합니다. 이제 예제와 우리의 사례가 다른 점을 살펴볼 수 있습니다. 한가지 차이점은 RCP에서 실행되고 있다는 것입니다. 그게 아직 중요한지 확실하지 않습니다. 감사! –

+0

@LorisSecuro - 감사합니다. 당신의 관찰은 내 코드의 두 가지 문제로 이어져서, 관찰 된 행동이 기본값과 다르게되었습니다. 문제 중 하나가 다른 사람들에게 영향을 미칠 수 있으므로 답변으로 게시했습니다. –

답변

0

내가보고 있던 동작이 기본 동작이나 기본 동작이 아닙니다. @ LorisSecuro의 의견과이를 명확하게 보여주는 사례에 감사드립니다.

두 가지 문제점을 발견하고 해결했습니다.

첫 번째 것은 내 잘못입니다. ICheckStateListener에서 일부 코드를 놓쳤습니다 ... 선택 항목을 설정하십시오.

두 번째 문제는 다른 사람들이 뛰어 다니는 것이 었습니다. CheckboxTreeViewer는이 변경되지 않았더라도 다른 사람이 항목을 선택/선택 취소 할 때마다 으로 내 ISelectionChangedListener을 호출했습니다. 내 ISelectionChangedListener가 호출 되었다면 선택이 변경되었다고 가정하고 트리 외부에서 선택 항목을 설정합니다.

MySelectionChangedListener.selectionChanged(SelectionChangedEvent event) 
... 
CheckboxTreeViewer(Viewer).fireSelectionChanged(SelectionChangedEvent) line: 160  
CheckboxTreeViewer(StructuredViewer).updateSelection(ISelection) line: 2197 
CheckboxTreeViewer(StructuredViewer).handleSelect(SelectionEvent) line: 1228  
CheckboxTreeViewer.handleSelect(SelectionEvent) line: 291 
StructuredViewer$4.widgetSelected(SelectionEvent) line: 1257  
OpenStrategy.fireSelectionEvent(SelectionEvent) line: 242 
... 

해결책은 간단합니다. 선택을 추적하고 ISelectionChangedListener에서 수행하기 전에 실제로 변경되었는지 확인합니다. [예 프로그램 (http://www.java2s.com/Code/Java/SWT-JFace-Eclipse/DemonstratesCheckboxTreeViewer.htm)를 사용하여 (및 추가 스타일 '윈도우 10에서

@Override 
public void selectionChanged(SelectionChangedEvent event) { 
    ITreeSelection treeSelection = m_treeViewer.getStructuredSelection(); 
    List<?> newSelection = treeSelection.toList(); 

    if (! m_lastKnownSelection.equals(newSelection)) { 
    ... 
    m_lastKnownSelection = newSelection; 
    } 
}