首页 新闻 论坛 群组 Blog 文档 下载 读书 Tag 网摘 搜索 开源 FAQ 第二书店 博文视点 程序员
频道: 研发 数据库 中间件 信息化 视频 .NET Java 游戏 移动 服务: 人才 外包 培训
    图书品种:235680
       
热门搜索: ASP.NET Ajax Spring Hibernate Java

20.6  编辑器类方法的使用说明

在20.5节ChinaEditor类继承EditorPart抽象类时,只实现了init、createPartControl两方法,本节将逐步讲解其他的5个方法的用法。

20.6.1  EditorPart方法的执行情况

要使用好EditorPart,首先得了解其方法在各种情况下的执行流程。在类的每一个方法中加上一打印语句,运行后看打印输出,就可以得到如下方法执行流程。

(1)双击列表项打开编辑器时:init→isDirty→createPartControl→isDirty→isDirty→isDirty→isDirty→isDirty→setFocus→isDirty→isSaveAsAllowed。

(2)关闭编辑器时:setFocus→isDirty→isSaveAsAllowed→isDirty→isSaveAsAllowed→setFocus→isDirty,如果保存编辑器,则最后还会执行doSave方法。

(3)单击编辑器标题时:setFocus。

(4)编辑器失去焦点时:isDirty→isSaveAsAllowed→isDirty→isSaveAsAllowed。

(5)编辑器得到焦点时:setFocus→isDirty→isSaveAsAllowed→isDirty→isSaveAs Allowed。

(6)当编辑器可以保存,选择主菜单“文件→保存”或按Ctrl+S快捷键时:isDirty→doSave。

20.6.2  各方法的作用及含义

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( )

当编辑器获得焦点时执行该方法。

20.6.3  一个编辑器实例

在本实例中,当修改ChinaEditor编辑器中文本框的文字时,编辑器标题前出现“*”且主菜单“文件→保存”可用。当编辑器保存后,“*”消失并且“保存”菜单不可用。当编辑器为脏时,关闭编辑器会弹出一个提示保存的对话框,如图20.7所示。

图20.7  关闭脏编辑器时的效果图

要实现以上效果只需修改ChinaEditor类,修改后的代码如下:

public class ChinaEditor extends EditorPart {

         private boolean dirty = true; // 编辑器是否为脏的标识

         …… init方法不变,省略

         public void createPartControl(Composite parent) {

                   ……

                   text.addKeyListener(new KeyAdapter() {

                            public void keyPressed(KeyEvent e) {

                                     // 如果编辑器不脏(即没有修改),则标志它非脏并刷新界面状态

                                     if (!isDirty()) {

                                               setDirty(true);

                                               firePropertyChange(IEditorPart.PROP_DIRTY);

                                     }

                            }

                   });

         }

         // 保存的处理代码在这种方法中,当按Ctrl+S键时会执行此方法

         // 最后别忘记标志为非脏及刷新界面状态

         public void doSave(IProgressMonitor monitor) {

                   if (isDirty()) {

                            // ……保存编辑器事件处理代码(省略)

                            setDirty(false);

                            firePropertyChange(IEditorPart.PROP_DIRTY);

                   }

         }       

         public boolean isSaveAsAllowed() {          return false; }// 是否允许“另存为”,false不允许  

         public void doSaveAs() {}// “另存为”的代码写在这里,本例不实现它

         public void setDirty(boolean dirty) {  this.dirty = dirty; }// 设置dirty(脏)标识

         public boolean isDirty() {  return dirty;     }// 编辑器的内容是否脏了。true脏,false不脏   

         public void setFocus() {}// 当编辑器获得焦点时会执行此方法,本例空实现

}

程序说明:firePropertyChange(IEditorPart.PROP_DIRTY)这一句除了能将界面状态刷新之外,如果IEditorPart对象添加了如下监听器,则还可以触发其中的propertyChanged事件。

chinaEditor.addPropertyListener(new IPropertyListener() {

    //此时source为ChinaEditor对象,propId为IEditorPart.PROP_DIRTY这个常量值

         public void propertyChanged(Object source, int propId) {

                   //……事件处理代码,省略

         }

});

查看所有评论(0)条】

最近评论



正在载入评论列表...
热点评论