2015-11-05 51 views
0

我正在研究Eclipse RCP應用程序,我試圖根據TableViewerMyEditorPart的選擇更改更新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行?

缺少什麼我在這裏?聽取選擇變化的正確方法是什麼?

在此先感謝。

回答

1

你需要的不是一個SelectionListener,而是一個SelectionChangedListener

有了這個,你可以寫下面的代碼:

viewer.addSelectionChangedListener(new ISelectionChangedListener() { 
    @Override 
    public void selectionChanged(SelectionChangedEvent event) { 
    IStructuredSelection selection = viewer.getStructuredSelection(); 
    Object firstElement = selection.getFirstElement(); 
    // do something with it 
    } 
}); 
+0

我理解,但我要創建另一個類'MySourceProvider'聽衆,這就是爲什麼我試圖使用'getSelectionService() .addPostSelectionListener()',這個方法只接受'ISelectionListener'?取而代之的是,我應該使用EventBroker的解決方案來通知'MySourceProvider'嗎? – emrekgn

+0

你需要的可能是一個簡單的回調函數。儘量避免使用JFace技巧來過度複雜化。如果您想要響應的操作是「用戶選擇表中的項目」,則您需要的JFace偵聽器是selectionChangedListener。從那以後,剩下的就是分享引用和調用你寫的方法。 –

0

但看來這種形式的addPostSelectionListener僅火災時,該部分變得活躍。使用:

addPostSelectionListener(ISelectionListener listener) 

每個選擇更改都會調用的偵聽器的形式。

然後,您可以在收聽測試IWorkbenchPart ID:

@Override 
public void selectionChanged(final IWorkbenchPart part, final ISelection selection) 
{ 
    if (MyEditorPartId.equals(part.getSite().getId())) 
    { 
    // your code 
    } 
} 
+0

我試過了,但不幸的是它有同樣的問題,它只會觸發一次。原諒我這個愚蠢的問題,但我發現的例子總是使用這個監聽器 - 來自'ViewPart'的選擇提供者機制,我想知道它是否與使用'EditorPart'有關?因爲我有一些使用這種機制的'ViewPart'類,它們工作正常。 – emrekgn

+0

這對我使用EditorPart進行測試的效果很好 –