我正在研究Eclipse RCP應用程序,我試圖根據TableViewer
中MyEditorPart
的選擇更改更新MySourceProvider
提供的表達式值。如何收聽TableViewer上的選擇更改?
MyEditorPart
實例定義一個TableViewer
這樣的:
public class MyEditorPart extends EditorPart {
@Override
public void createPartControl(Composite parent) {
TableViewer tableviewer = new TableViewer(parent, SWT.CHECK);
tableviewer.setContentProvider(ArrayContentProvider.getInstance());
getSite().setSelectionProvider(tableViewer);
...
MySourceProvider
有一些表達值是這樣的:
public class MySourceProvider extends AbstractSourceProvider {
public static final String EXPR = "org.xyz.isEntrySelected";
// other expressions
@Override
public String[] getProvidedSourceNames() {
return new String[] { EXPR,
// other expressions
};
}
@Override
public Map getCurrentState() {
HashMap<String, Object> map = new HashMap<String, Object>(1);
map.put(EXPR, expr_value); // expr_value calculated by the listener
// other expressions
return map;
}
我想根據上TableViewer
選擇更改爲更改expr_value
。 我註冊了偵聽器是這樣的:
window.getSelectionService().addPostSelectionListener(MyEditorPartId, selectionListener);
private final ISelectionListener selectionListener = new SelectionListener() {
@Override
public void selectionChanged(IWorkbenchPart part, ISelection selection) {
handleEvent();
}
};
監聽器註冊成功,但如果我的地方點擊MyEditorPart
(不只是TableViewer
但整個編輯器)得到通知一次。要再次得到通知,我必須點擊其他視圖(或編輯器)部分才能失去焦點,然後再次點擊MyEditorPart
。
1.爲什麼MyEditorPart
重新獲得焦點時只收到一次通知?
2.如何收聽只有將選擇更改爲TableViewer
行?
缺少什麼我在這裏?聽取選擇變化的正確方法是什麼?
在此先感謝。
我理解,但我要創建另一個類'MySourceProvider'聽衆,這就是爲什麼我試圖使用'getSelectionService() .addPostSelectionListener()',這個方法只接受'ISelectionListener'?取而代之的是,我應該使用EventBroker的解決方案來通知'MySourceProvider'嗎? – emrekgn
你需要的可能是一個簡單的回調函數。儘量避免使用JFace技巧來過度複雜化。如果您想要響應的操作是「用戶選擇表中的項目」,則您需要的JFace偵聽器是selectionChangedListener。從那以後,剩下的就是分享引用和調用你寫的方法。 –