前文回顧:
1 插件學習篇
4 SWT編程須知
7 SWT布局詳解
前幾篇講解了SWT的基本知識。這篇作為穿插,講述一下工作終於到的一個問題,並且借着這個機會,好好的學習了一下!
先描述下我遇到的問題吧:
由於對插件的了解也並不全面,很多知識點都不知道。學習其他人的開源源碼時,我遇到了下面的報錯:
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中擴展的一個初始化函數。
知道了原因,那么就好好研究下吧!
IPregerenceStore
它是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的使用過程大致就是如此了!
總結起來這次調試過程,歸結原因,只能算是自己無知了,學無止境!
