2012-11-05 4 views
3

이클립스 플러그인보기 (예 : helloworld-view-plugin-project와 유사)이 있습니다. 보기 파일에서보기를 업데이트하려고 할 때 이벤트가 발생합니다.이클립스 플러그인에서보기를 업데이트/새로 고치는 방법은 무엇입니까?

이보기에는 여러 레이블이있는 그룹에 GridData가 있습니다. 몇 가지 프로그램에 등록하고 그 상태가이 GridData에으로 표시되어야합니다.

편집 : 더 나은 내 문제를 보여주기 위해 나는이 게시물을 업데이트하고 전체 코드 추가 :


CreatePartControl() :

public void createPartControl(Composite _parent) { 
    parent = _parent; 
    createContents(); 
    addBindings(); 
    makeActions(); 
    contributeToActionBars(); 
} 

CreateContents() :

protected void createContents() { 

    // fixed 
    checkIcon = //... 
    errorIcon = //... 
    smallFont = SWTResourceManager.getFont("Segoe UI", 7, SWT.NORMAL); 

    // content 
    gl_shell = new GridLayout(1, false); 
    //margins, etc. for gl_shell 
    parent.setLayout(gl_shell); 

    final Label lblGreeting = new Label(parent, SWT.NONE); 
    lblGreeting.setLayoutData(new GridData(SWT.FILL, SWT.TOP, false, false, 1, 1)); 
    lblGreeting.setText("Hi " + Preferences.getPreName()); 

    // -- GROUP YOUR STATS (show all services) 
    createStatusGroupBox(); 
} 

createStatusGroupBox() :

private Group grpYourStatus = null; // outside the method for access in listener (below) 

private void createStatusGroupBox() { 
    grpYourStatus = new Group(parent, SWT.NONE); 
    grpYourStatus.setLayoutData(new GridData(SWT.FILL, SWT.TOP, true, false, 1, 1)); 
    grpYourStatus.setText("Your upload status"); 
    grpYourStatus.setLayout(new GridLayout(3, false)); 

    // add message if no service is registered 
    if (r.getServiceList().size() == 0) { 
    Label status = new Label(grpYourStatus, SWT.NONE); 
    status.setText("No service registered."); 
    new Label(grpYourStatus, SWT.NONE); //empty 
    new Label(grpYourStatus, SWT.NONE); //empty 
    } 

    // add labels (status, message, name) for each registered service 
    for (IRecorderObject service : r.getServiceList()) { 
    Label name = new Label(grpYourStatus, SWT.NONE); 
    Label status = new Label(grpYourStatus, SWT.NONE); 
    Label message = new Label(grpYourStatus, SWT.NONE); 
    message.setFont(smallFont); 
    message.setLayoutData(new GridData(SWT.LEFT, SWT.CENTER, true, false, 1, 1)); 

    service.getServiceViewItem().setLabelsAndIcons(name, status, message, checkIcon, errorIcon); //this also sets the values of the labels (label.setText(...) via data binding) 
} 

불행하게도, 내가 올바른 방법이 재설정/업데이트하는 것입니다 모르겠어요. (보기를 업데이트해야합니다/서비스 목록)

청취자 : 나는 다음과 같은 노력

r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() { 
    public void propertyChange(final PropertyChangeEvent evt) { 
    Display.getDefault().asyncExec(new Runnable() { 
     public void run() { 
     // This "redraws" the view, but just places the whole content (generated in createStatusGroupBox()) above the other parts. 
     //Display.getCurrent().update(); 
     //createStatusGroupBox(); 
     //parent.layout(true); 
     //parent.redraw(); 

     // disposes grpYourStatus-Group but doesn't show anything then 
     grpYourStatus.dispose(); 
     createStatusGroupBox(); 
     grpYourStatus.layout(); 
     grpYourStatus.redraw(); 
     } 
    }); 
    } 
}); 

가 나는 또한 (개별적으로) 다음 문을 노력을; 모든 성공하지 : 그 위젯이 생성되는 포함 된보기의 라이프 사이클의

createPartControls을하는 시간합니다 (:

parent.redraw(); 
parent.update(); 
parent.layout(); 
parent.layout(true); 
parent.refresh(); 

post에서 나는 다음을 읽어 보기가 처음에 으로 표시됨). 이 코드는보기 수명 인 주기 동안 한 번만 실행되므로 직접 여기에 아무 것도 추가 할 수 없으므로 보기를 새로 고침하십시오.

이클립스 부품은 일반적으로 워크 벤치 내부에서 변경된 변경 사항에 대한 반응으로 콘텐츠를 업데이트합니다 (예 : 디버그보기의 다른 스택 프레임에서 클릭).

불행하게도, 내가 시도 할 수 내가 검색에 도움이 아무것도 발견하지 않은 다른 사람을 모르겠어요 ... 당신의 도움과 제안에 대한 감사의!

답변

3

드디어 답을 발견했습니다 (AndreiC의 도움과 함께!) :

내 리스너는 이제 다음과 같습니다

r.addPropertyChangeListener(BindingNames.SERVICE_ADDED, new PropertyChangeListener() { 
    public void propertyChange(final PropertyChangeEvent evt) { 
    Display.getDefault().asyncExec(new Runnable() { 
     public void run() { 
     // remove grpYourStatus from parent 
     grpYourStatus.dispose(); 

     // add grpYourStatus (with updated values) to parent 
     createStatusGroupBox(); 

     // refresh view 
     parent.pack(); 
     parent.layout(true); 
     } 
    }); 
    } 
}); 

나머지는 위의 코드와 같이 동일합니다.

1

API가 마음에 들지는 않지만 parent.update()을 사용해 보셨습니까?

+0

답장을 보내 주신 Andrei에게 감사드립니다. 예, 나는 또한 그것을 시도했습니다 (내 게시물에 추가됨). 다른 제안이 있으십니까? 감사합니다 – casaout

+0

redraw()를 사용하지 않고 layout()을 사용하려고 했습니까? – acostache

+0

불행히도 parent.layout()은 아무 것도 변경하지 않았습니다 ... – casaout

관련 문제