2012-12-06 77 views
1

我有Eclipse RCP應用程序。我自己的IntroPart擴展了org.eclipse.ui.part.IntroPart。 通過繼承我得到這個方法:關閉/打開介紹部分之間的狀態

@Override 
public void saveState(IMemento memento) { 
} 

Here是說,當工作臺被關閉,該方法saveState和被稱爲上所有打開的視圖。但是,只有在關閉我的洞應用程序時纔是如此。如果我只關閉此頁面,而不是洞口應用程序,我應該怎麼做才能保存介紹頁面狀態?

+0

調用'saveState'方法? – tkotisis

+0

調用'saveState'would是一個偉大的想法,如果你弄清楚如何獲得用於保留在工作臺 – benez

回答

2

link的常見問題回答說:

另一種機制,堅持視圖狀態是JFace的IDialogSettings設施。對話框設置優於視圖保存/初始化機制的優點是,您可以控制何時保持設置。

這是一個關於如何使用IDialogSettings堅持一個IntroPart的狀態,當它被關閉,以及如何創建時,以恢復它的一個示例。 MyIntroPart是一個具有Text小部件的IntroPart。顯示的文本在IntroPart關閉時保存,並在創建時恢復。

要獲取partClosed事件,MyIntroPart會實現IPartListener2並向PartService註冊自己。

private static final String MY_INTRO_SETTINGS = "my_intro_settings"; 
private static final String MY_INTRO_TEXT_KEY = "my_intro_text"; 

@Override 
public void createPartControl(Composite parent) { 
    this.text = new Text(parent, SWT.BORDER); 

    // try to load the settings 
    IDialogSettings settings = Activator.getDefault().getDialogSettings(); 
    IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS); 
    if (section != null) { 
     // set the restored text string in the text widget 
     this.text.setText(section.get(MyIntroPart.MY_INTRO_TEXT_KEY)); 
    } 

    // register the part listener 
    getIntroSite().getWorkbenchWindow().getPartService().addPartListener(this); 
} 

這會將文本恢復到文本小部件。

MyIntroPart實現IPartListener2的partClosed當視圖被關閉,以節省對話框設置:

@Override 
public void partClosed(IWorkbenchPartReference partRef) { 
    // remove part listener from part service 
    getIntroSite().getWorkbenchWindow().getPartService().removePartListener(this); 

    IDialogSettings settings = Activator.getDefault().getDialogSettings(); 

    // get the section of the text 
    IDialogSettings section = settings.getSection(MyIntroPart.MY_INTRO_SETTINGS); 

    // if it doesn't exist, create it 
    if (section == null) { 
     section = settings.addNewSection(MyIntroPart.MY_INTRO_SETTINGS); 
    } 

    // put text from text field in section 
    section.put(MyIntroPart.MY_INTRO_TEXT_KEY, this.text.getText()); 
} 

感謝弗雷德裏克用於指出沒有加載從或保存到一個文件,這裏需要。

+0

狀態,您可以跳過「文件名」的東西'IMemento'對象。只需從插件激活器中檢索設置,將其與get/put一起使用,並且在應用程序存在時(調用Activator.stop()時)將保持設置。 – fredrik

+0

@fredrik謝謝!我認爲在這裏需要調用'save',因爲OP在關閉部件後想要保存,而不是在退出應用程序之後。但它實際上沒有使用文件就像預期的那樣工作。我改變了代碼。 –