簡體   English   中英

如何刷新Eclipse View插件

[英]How to Refresh Eclipse View Plugin

我基於eclipse插件視圖教程創建了一個簡單的視圖。 我添加了允許我的插件偵聽調試器上的更改的功能。 我的問題是,每次調試器發生問題時,我都希望刷新視圖並使用新信息進行更新。 這是我所嘗試的/正在嘗試的:

    public void createPartControl(Composite parent) {

        listener = new DebugContextListener(this);
        DebugUITools.getDebugContextManager().addDebugContextListener(listener);

        // Check if there is an already started debug context
        IAdaptable dc = DebugUITools.getDebugContext();
        if (dc != null) {
                dataCollection.add(new ProxyScope("hi")); // manually injecting data 
                Object o = dc.getAdapter(IStackFrame.class);
                if (o instanceof IStackFrame)
                        setStackFrame((IStackFrame) o);

                viewer.refresh(); // this doesn't work
        }       


        viewer = new TreeViewer(parent, SWT.MULTI | SWT.H_SCROLL | SWT.V_SCROLL);

        // Set column lines visible, and create two columns
        Tree tree = viewer.getTree();
        tree.setHeaderVisible(true);
        tree.setLinesVisible(true);

        TreeColumn column1 = new TreeColumn(tree, SWT.LEFT);
        column1.setText("Name");
        column1.setWidth(400);
        TreeColumn column2 = new TreeColumn(tree, SWT.LEFT);
        column2.setText("Value");
        column2.setWidth(200);

        drillDownAdapter = new DrillDownAdapter(viewer);
        viewer.setContentProvider(new VariableViewContentProvider());
        viewer.setLabelProvider(new VariableViewLabelProvider());
        viewer.setSorter(new ViewerSorter());
        viewer.setInput(getViewSite());

....

}

因此,基本上,所有這些調試偵聽邏輯都位於頂部,它發生在if語句內部。 我知道我的程序進入那里。 每次發生重大變化時,我都希望刷新視圖,並且我嘗試執行viewer.refresh,但該方法不起作用。 我的視圖顯示的信息基於dataCollection對象,因此與dataCollection.add ...對應的行就是我只是手動添加數據,就像調試器做了什么一樣。 如果我把那行放在if語句之外,那么我的視圖就起作用了(我猜這只是我第一次啟動該插件時視圖的原始結構),但是當我把它放在if語句中時,它是行不通的,這表示我的觀點永不刷新。

感謝您的任何幫助。

createPartControls是視圖生命周期的時間,在該時間中創建其包含的小部件(當視圖最初可見時)。 該代碼在視圖生命周期中僅執行一次,因此您不能在此處直接添加任何內容來刷新視圖。

Eclipse部件通常會更新其內容,以響應工作台內部更改的選擇(例如,用戶可能在調試視圖中單擊另一個堆棧框架)。 我不確定這是否已經完全滿足您的需求,但這是一個很好的開始,並且在Eclipse FAQ中進行了很好的描述。

我有一個與tableViewer類似的問題。 在一種情況下,簡單的viewer.refresh()起作用了,但在另一種情況下,我不得不獲得一種並非如此“美麗”的解決方案。

我現在擁有的解決方案不是使用viewer.setInput(null)將輸入設置為null,然后再次將輸入設置為更新的數據。 這對我來說是暫時的結果,因為我沒有大量數據。 否則,每次更改的創建開銷可能都不可行。

如果我找到一個更清潔的解決方案,我將其發布。

感謝Bananeweizen的回答,即使有更好的方法,我也能夠破解一些與我需要執行的代碼類似的代碼。 我添加了ISelectionListener,它在選擇事件發生時進行偵聽(這在ViewPart類中作為全局變量出現):

 ISelectionListener selectionListener = new ISelectionListener() { public void selectionChanged(IWorkbenchPart part, ISelection sel) { if (!(sel instanceof IStructuredSelection)) return; IStructuredSelection ss = (IStructuredSelection) sel; if(sel.toString().contains("org.eclipse.jdt.internal.debug.core.model")){ viewer.setInput(getSite()); } } }; 

因此,如果單擊任何調試按鈕,它將刷新我的視圖。 setInput基本上在ContentProvider中調用getElements(),它提供了有關如何在視圖中形成表格的特定實現。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM