上面有講ChinaEditor類繼承EditorPart抽象類時,只實現了init,createPartControl兩個方法,本節將逐步講解其他的5個方法的用法.
EditorPart方法的執行情況.
要使用好EditorPart,首先得了解其方法在各種情況下的執行流程,在類的每一個方法中加上一個打印語句.運行后看打印輸出,就可以得到如下方法執行流程.
(1)雙擊列表項打開編輯器時
init--->isDirty--->createPartContorl--->isDirty--->isDirty--->isDirty--->isDirty--->isDirty--->setFocus--->isDirty--->isSaveAsAllowed.
(2)關閉編輯器時,setFocus--->isDirty--->isSaveAsAllowed--->isDirty--->isSaveAsAllowed--->setFocus--->isDirty如果保存保存編輯器,則最后還會執行doSave()方法.
(3)單擊編輯器標題時:setFocus
(4)編輯器失去焦點時:isDirty--->isSavedAsAllowed--->isDirty----->isSaveASAllowed.
(5)編輯器得到焦點時:setFocus---->isDirty---->isSaveAsAllowed---->isDirty----->isSaveAsAllowed.
(6)當編輯器可以保存,選擇主菜單"文件--->保存"或按Ctrl+S快捷鍵時:isDirty--->doSave.
各個方法的作用以及含義:
1.boolean isDirty()
由此方法獲知編輯器是否臟了(所謂"臟"是指編輯器中的值已經發生了改變),true表示臟了,當其返回true時,會出現兩個效果:編輯器的標題出現一個"*"號,主菜單"文件"下的"保存"項可用.
特別要注意的是:編輯器不會自己判斷自己是否臟了,這需要在程序中用語句手動設置,例如:在編輯器的文本框加入一個鍵盤監聽事件,當在文本框中輸入字符時,則將isDirty方法返回值設置為true(臟).
在方法執行的過程中,可以看到此方法的執行是最頻繁的,所以不要在此方法中加入太耗時的執行語句.否則會影響程序執行速度.
2.void doSave()
在這個方法中編寫保存編輯器的代碼,當選擇主菜單"文件---->保存"時也會執行此方法.但因在isDirty返回true時,"保存"菜單和Ctrl+S快捷鍵才能用,也即isDirty方法控制着doSave方法的執行.
當保存成功時,要注意將臟的狀態設置回false,並調用firePropertyChange方法將編輯器的界面狀態更新(編輯器標題前的"*"號以及"保存"菜單).
3.boolean isSaveAsAllowed()
是否允許編輯器使用"另存為"功能,如果此返回false,則不能使用"另存為"功能,而且主菜單"文件"下的"另存為"項被置灰.
4.void doSaveAs()
和doSave的作用相似,在這里書寫"另存為"功能的處理代碼.
5.void setFocus()
當編輯器獲得焦點時執行該方法.
一個編輯器實例
在本例子中,當修改ChinaEditor編輯器中文本框的文字時候,編輯器標題前出現"*"而且主菜單"文件---->保存"可用,當編輯器保存后,"*"消失並且"保存"菜單不可用,當編輯器為臟時,關閉編輯器會彈出一個提示保存的對話框.
ChinaEditor.java(前面的我貼的代碼就是全部的,這里再貼 一遍)
1 public class ChinaEditor extends EditorPart { 2 private boolean dirty = true; // 編輯器是否為臟的標識 3 4 // Editor的初始化方法。本方法前兩句是固定不變的 5 public void init(IEditorSite site, IEditorInput input) throws PartInitException { 6 System.out.println("init"); 7 setSite(site); 8 setInput(input); 9 // 下一句設置Editor標題欄的顯示名稱,否則名稱用plugin.xml中的name屬性 10 // setPartName(input.getName()); 11 // 下一句設置Editor標題欄的圖標,否則會自動使用一個默認的圖標 12 // setTitleImage(input.getImageDescriptor().createImage()); 13 } 14 15 // 在此方法中創建Editor中的界面組件 16 public void createPartControl(Composite parent) { 17 System.out.println("createPartControl"); 18 Composite topComp = new Composite(parent, SWT.NONE); 19 topComp.setLayout(new FillLayout()); 20 Text text = new Text(topComp, SWT.BORDER); 21 text.setText("中國之編輯器"); 22 23 text.addKeyListener(new KeyAdapter() { 24 public void keyPressed(KeyEvent e) { 25 // 如果編輯器不臟(即沒有修改),則標志它臟並刷新界面狀態 26 if (!isDirty()) { 27 setDirty(true); 28 firePropertyChange(IEditorPart.PROP_DIRTY); 29 } 30 } 31 }); 32 } 33 34 // 保存的處理代碼在這種方法中,當按Ctrl+S鍵時會執行此方法。 35 // 最后別忘記標志為非臟及刷新界面狀態 36 public void doSave(IProgressMonitor monitor) { 37 if (isDirty()) { 38 // ……保存編輯器事件處理代碼(省略) 39 setDirty(false); 40 firePropertyChange(IEditorPart.PROP_DIRTY); 41 } 42 } 43 44 // 是否允許“另存為”,false不允許 45 public boolean isSaveAsAllowed() { 46 return false; 47 } 48 49 // “另存為”的代碼寫在這里,本例不實現它 50 public void doSaveAs() {} 51 52 // dirty標識的set方法,由此方法設置編輯器為臟 53 public void setDirty(boolean dirty) { 54 this.dirty = dirty; 55 } 56 57 // 編輯器的內容是否臟了。true臟,false不臟 58 public boolean isDirty() { 59 return dirty; 60 } 61 62 // 當編輯器獲得焦點時會執行此方法,本例空實現 63 public void setFocus() {} 64 }
程序說明:firePropertyChange(IEditorPart.PROP_DIRTY)這一句除了能將界面狀態刷新之外,如果IEditorPart對象添加了如下監聽器,則還可以觸發其中的propertyChange事件.
chinaEditor.addPropertyListener(new IPropertyListener(){
//此時source為ChinaEditor對象,propId為IEditorPart.PROP_DIRTY這個常量值
public void propertyChanged(Object source,int propId){
//......事件處理代碼,這里省略
}
})