[英]Eclipse: create preference page programmatically
我正在嘗試以編程方式創建首選項頁面,我需要使用首選項頁面而不在plugin.xml中定義preferencePage擴展點我非常接近解決方案,我能夠加載頁面並在第一次應用程序時保存值負載,
我的代碼的核心是
PreferenceManager pmngr= PlatformUI.getWorkbench().getPreferenceManager();
//this come from other plugins that implements my personal IPreferences
PreferencePageRCP page =new PreferencePageRCP((IPreferences) element.createExecutableExtension("class"));
PreferenceNodeRCP node= new PreferenceNodeRCP(page.getId(), page.getTitle(),null,PreferencePageRCP.class.getName());
node.setPage(page);
pmngr.addToRoot(node);
其中PreferencePageRCP是我的自定義首選項頁面所以這一點我讓我的PreferencePage工作!
但是當我第二次進入首選項窗口時,我在PreferenceNode.createPage上出現錯誤,所以現在我自己的PreferenceNode類重寫了createPage但是現在我遇到了一個UI錯誤
Problems occurred when invoking code from plug-in: "org.eclipse.jface".
!STACK 0
org.eclipse.swt.SWTException: Widget is disposed
at org.eclipse.swt.SWT.error(SWT.java:4083)
at org.eclipse.swt.SWT.error(SWT.java:3998)
at org.eclipse.swt.SWT.error(SWT.java:3969)
at org.eclipse.swt.widgets.Widget.error(Widget.java:468)
at org.eclipse.swt.widgets.Widget.checkWidget(Widget.java:340)
at org.eclipse.swt.widgets.Control.setVisible(Control.java:3370)
at org.eclipse.jface.dialogs.DialogPage.setVisible(DialogPage.java:470)
at org.eclipse.jface.preference.FieldEditorPreferencePage.setVisible(FieldEditorPreferencePage.java:374)
at org.eclipse.jface.preference.PreferenceDialog.showPage(PreferenceDialog.java:1323)
at org.eclipse.ui.internal.dialogs.FilteredPreferenceDialog.showPage(FilteredPreferenceDialog.java:673)
at org.eclipse.jface.preference.PreferenceDialog$10.run(PreferenceDialog.java:708)
at org.eclipse.swt.custom.BusyIndicator.showWhile(BusyIndicator.java:70)
andContributionItem.java:796
.................
所以第二次在UI中缺少一些東西我此時無法修復我的代碼,有人成功地以編程方式創建了首選項頁面???
這是java代碼,它允許以編程方式創建首選項頁面:
//create an instance of the custom MyPreference class
IPreferencePage page = new MyPreference();
page.setTitle("Custom Configurations");
//create a new PreferenceNode that will appear in the Preference window PreferenceNode node = new PreferenceNode("1", page);
//use workbenches's preference manager PreferenceManager pm= PlatformUI.getWorkbench().getPreferenceManager();
pm.addToRoot(node); //add the node in the PreferenceManager
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
//instantiate the PreferenceDialog PreferenceDialog pd = new PreferenceDialog(shell, pm);
//this line is important, it tell's the PreferenceDialog which preference-store it should write to pd.setPreferenceStore(Activator.getDefault().getPreferenceStore()); pd.create(); pd.open();
最后我發現只是我不能通過使用默認首選項頁面查看器的代碼來做到這一點!
所以我意識到每次調用加載PreferenceDialog的處理程序,每次都創建節點和頁面。 這是我找到的唯一方法,也是有效的。
Skip給出的答案幾乎是正確的。
引發異常是因為,一旦關閉對話框,頁面就會從IPreferenceNode中刪除,但該節點仍然保留在PreferenceManager中,因此它會因未找到頁面而引發異常。
在將節點添加到PreferenceManager之前,我們必須手動刪除節點。
pm.removeAll()
//create an instance of the custom MyPreference class
IPreferencePage page = new MyPreference();
page.setTitle("Custom Configurations");
//create a new PreferenceNode that will appear in the Preference window
PreferenceNode node = new PreferenceNode("1", page);
//use workbenches's preference manager
PreferenceManager pm= PlatformUI.getWorkbench().getPreferenceManager();
pm.removeAll(); // removes the previous nodes
pm.addToRoot(node); //add the node in the PreferenceManager
Shell shell = PlatformUI.getWorkbench().getActiveWorkbenchWindow().getShell();
//instantiate the PreferenceDialog
PreferenceDialog pd = new PreferenceDialog(shell, pm);
//this line is important, it tell's the PreferenceDialog which preference-store it should write to
pd.setPreferenceStore(Activator.getDefault().getPreferenceStore());
pd.create();
pd.open();
這將完美地工作。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.