前文回顧:html
1 插件學習篇java
3 利用擴展點,開發透視圖eclipse
4 SWT編程須知ide
5 SWT簡單控件的使用與佈局搭配函數
6 SWT複雜空間與佈局搭配佈局
7 SWT佈局詳解學習
前幾篇講解了SWT的基本知識。這篇做爲穿插,講述一下工做終於到的一個問題,而且藉着這個機會,好好的學習了一下!this
因爲對插件的瞭解也並不全面,不少知識點都不知道。學習其餘人的開源源碼時,我遇到了下面的報錯:spa
1 org.eclipse.jface.resource.DataFormatException 2 at org.eclipse.jface.resource.StringConverter.asRGB(StringConverter.java:567) 3 at com.xxxxxx.rcp.dbeditor.util.EditorColorProvider.getToken(EditorColorProvider.java:32)
根據報錯提示的位置,以及調試發現,是有colorName爲空,從而沒法進行轉換。
1 public IToken getToken(String prefKey) { 2 System.out.println(store.getString(prefKey)); 3 Token token = (Token) tokenTable.get(prefKey); 4 if (token == null) { 5 String colorName = store.getString(prefKey); 6 RGB rgb = StringConverter.asRGB(colorName); 7 token = new Token(new TextAttribute(getColor(rgb))); 8 tokenTable.put(prefKey, token); 9 } 10 return token; 11 }
追蹤堆棧,發現這個store根本沒有任何getString的方法以及map類型的存儲集合。
很費解這個對象時怎麼回事,因而再從新學習源碼,各類比對,發現都是相同的。
而且這個對象時在插件初次加載的start函數經過getPreferenceStore()進行初始化的。
那麼就奇怪了,同樣的代碼過程,爲何源碼能夠查找到值,而個人卻不行呢?
因而查看IPreferenceStore接口的源碼,查找它的實現類,並無任何收穫!
無奈之下,只能百度了!
因而,萬能的百度再次立功了,原來是首選項中配置的內容。也就是說與手寫的代碼實際上是分離的,它是在擴展點org.eclipse.core.runtime.preferences中擴展的一個初始化函數。
知道了緣由,那麼就好好研究下吧!
它是eclipse基於字符串的一個鍵值存儲結構,也就是說,以String類型爲主鍵,存儲其餘類型。它在插件加載的時候進行執行,而且存儲在本地。能夠同過getPregerenceStore()獲取這個對象,經過setDefault方法進行賦值。
接下來看一下這個對象的使用方法吧!
1 在擴展點中擴展org.eclipse.core.runtime.preferences
2 新建一個 initializer ,而且指定實現一個初始化的類
3 建立IPreferenceStore對象,並設定初始化值
1 import org.eclipse.core.runtime.preferences.AbstractPreferenceInitializer; 2 import org.eclipse.jface.preference.IPreferenceStore; 3 4 import testpreference.Activator; 5 6 public class AbstractPreferenceInitializer1 extends 7 AbstractPreferenceInitializer { 8 9 public AbstractPreferenceInitializer1() { 10 // TODO Auto-generated constructor stub 11 } 12 13 @Override 14 public void initializeDefaultPreferences() { 15 IPreferenceStore store = Activator.getDefault().getPreferenceStore(); 16 17 store.setDefault(Activator.PREF_PARAM_1, "hello"); 18 store.setDefault(Activator.PREF_PARAM_2, "xingoo"); 19 } 20 }
4 在Activator中進行初始化【並實現調用】
public class Activator extends AbstractUIPlugin { ... public static final String PREF_PARAM_1 = "param_1"; public static final String PREF_PARAM_2 = "param_2"; private IPreferenceStore store; public void start(BundleContext context) throws Exception { super.start(context); plugin = this; store =getPreferenceStore(); System.out.println("param1"+store.getString(PREF_PARAM_1)); System.out.println("param2"+store.getString(PREF_PARAM_2)); } ... }
IPreferenceStore的使用過程大體就是如此了!
總結起來此次調試過程,歸結緣由,只能算是本身無知了,學無止境!