2011-10-04 3 views
2

나는 JFace TreeViewer을 사용하는 앱을 가지고 있습니다. 나는 ContentProvider에 연결했다. 대부분, 잘 작동합니다. 그러나 노드 목록의 중간에 노드를 추가하거나 노드의 레이블을 변경해야하는 값을 변경하는 것과 같은 일부 작업의 경우 refresh() 호출이 작동하지 않습니다. 부모 노드를 포함하여 시도했는데 레이블 갱신을 위해 "true"라고 말합니다. 아무것도 항상 작동하지 않습니다.SWT에서 TreeViewer를 올바르게 새로 고치려면 어떻게해야합니까?

접을 수있는 노드를 닫고 추가 한 다음 확장하면 추가 된 노드가 표시됩니다. 그러나 이미 확장 된 경우 변경 사항이 표시되지 않습니다. 트리 정보를 디스크에 저장하고 보면 변경됩니다. 작동하지 않는 새로 고침은 TreeViewer입니다.

ContentProvider에서 inputChanged 메서드를 살펴 보았지만 앱 실행의 시작과 끝에서만 호출됩니다.

아무도 도와 줄 수 있습니까? 나는 대답을 암시하고 아무 것도 효과가없는 모든 웹 페이지를 읽었습니다.

+1

TreeViewer 버그 무료로하지 않습니다, 그래서 당신이 버그를 타격하는 것이 가능하다. 문제를 재현하는 데 사용할 수있는 짧은 코드 스 니펫을 제공하면 문제가 무엇인지 알 수 있습니다. –

답변

0

불행하게도, 아무것도 난이 해결되지 찾을 수 있습니다. 파일을 닫은 다음 다시 열어서 "새로 고침/업데이트"를 강제했습니다. 모든 조언을 주셔서 감사합니다.

2

refresh() 중에 contentprovider를 호출하면 안되는 inputChanged() - 트리 뷰어에 setInput()이 호출 될 때만 호출됩니다.

최악의 경우 요소를 새로 고치려면 원래 입력으로 setInput()을 호출 할 수 있지만 응용 프로그램에는 너무 느려질 수 있습니다.

기본적으로 그룹의 중간에 새 노드를 추가 할 때 부모 노드 (getChildren() 호출을 사용하여 추가 된 요소를 반환하는 노드) 또는 부모 중 하나를 새로 고쳐야합니다. 기본적으로 refresh()를 매개 변수없이 호출하면 이러한 이유로 작동합니다.

테스트를 위해 매개 변수없이 try()를 호출하고 작동 여부에 관계없이 try()를 호출하고 작동하는지 확인한 다음 응용 프로그램과 작동하는 가장 구체적인 노드를 찾습니다.

+0

답장을 보내 주셔서 감사합니다. 나는 매개 변수 (없음, 부모 노드, 부울)의 모든 조합에 새로 고침()을 시도했다 그리고 그것은 작동하지 않습니다. 나는 당신이 제안한 것처럼 setInput() 호출을 다시 시도했지만, 불행히도 그것도 작동하지 않았다. – Mark

+0

글쎄, setInput()가 작동하지 않는다면, 당신의 제공자 나 TreeViewer에 버그가있다. setInput()은 전체 모델을 다시로드하고 내용을 다시 그려야합니다. 그러나 슬프게도 나는 어떤 아이디어도 가지고 있지 않다. Danil Nachev가 재생산을위한 코드 스 니펫을 만들려고 노력한 것에 대한 두 번째 언급이다. –

1

아마도 이것은 분명하지만 UI 스레드에서 새로 고침을 호출하고 있습니까? 특히 다음을 시도하십시오.

Display.getCurrent().asyncExec(new Runnable() { 
    @Override 
    public void run() { 
     // TODO Call refresh() here 
    } 
}); 

또한 syncExec() 메소드가 있습니다.

희망이 도움이됩니다.

0

TreeViewer에 레이블 데코레이터를 적용 했습니까?

난 그냥 내가 전에 업데이트 (selectedItem가, 널 (null))가 실제로 업데이트를 적용한 적용 LabelDecorator없이 내 TreeViewer의 항목을 편집 (그 전에 아무것도하지 않았다).

아마 jface 버그입니까?

[편집] DecoratingLabelProvider 객체의 updateLabel()을 사용해야하는 것 같습니다.