12321官方游戏论坛

 找回密码
 立即注册
查看: 3974|回复: 11

smartinvoke入门系列整合

[复制链接]

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
发表于 2017-7-7 14:11:03 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能,让你轻松玩转社区!

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
smartinvoke入门系列1——smartinvoke的安装


首先确保你已正确安装了flash builder4的插件版,不是插件版的同学可以安装插件版,或者添加Java开发工具JDT插件到你的flash builder中。


然后到http://smartrcp.googlecode.com/files/cn.smartinvoke.ide.zip下载smartinvoke开发工具,下载完毕后解压该zip文件后,将得到的所有jar文件拷贝到flash builder安装目录的plugins目录下。

重新开启flash builder,如果eclipse工具栏上出现如下图所示的图标就表明你已经安装成功了。


注意这里的flash builder都是第四版的。并非flex builder3


回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:12:35 | 显示全部楼层

smartinvoke入门系列2——smartinvoke轻松上手


简介:

本篇为smartinvoke开发系列的第一篇,主要让大家对smartinvoke有一个整体的认识,能够开发出简单独立的smartinvoke可运行桌面程序。
创建SmartInvoke项目:

依次选择Eclipse菜单栏中的 :文件 -> 新建 -> 其他 打开新建对话框,找到smartinvoke节点,选择New Project 节点,打开新建smartinvoke项目对话框,如下:
  




Project name 为项目名称;我们在这里输入:First
Main package 为项目入口类所在包名;我们在这里输入:cn.first
Class name 为项目入口类的类名称;我们在这里输入:FirstWin

输入完毕后点击完成,你会发现项目列表中新创建了两个项目,一个为Java类型项目,一个为Flex web application类型项目,结构如下图:






这两个项目构成了一个完整的smartinvoke项目First,它由Java类型项目First与Flex类型项目First_构成。Flex项目名称由Java项目名称加下划线”_”构成。通过这种项目名称的约定规则,smartInvoke IDE 将这两个项目关联在一起了。
这样一来,当调试或运行First_项目的FirstWin.mxml时,eclipse 不再是调用本机浏览器加载对应的swf了,而是调用关联的Java项目的入口类cn.first. FirstWin加载该swf。这样就实现了smartinvoke项目的开发与调试。Java项目First中的cn.first. FirstWin类是整个smartinvoke项目的入口类,它的main方法最先由jre调用执行。同时该类还控制着程序首先加载的swf文件的路径,程序打开主窗口的样式等。

通过将一个smartinvoke项目分割为两个相互关联的Java类型项目与Flex项目构成,这样使得程序的功能分工更加明确,Java负责逻辑,Flex负责界面显示。Java与Flex通信细节交由smartinvoke 完成。这样可以大大提高开发效率与代码的复用率。

创建服务类型(Service Class Type)实现Flex调用Java

这里的服务类型即实现了cn.smartinvoke.IServerObject接口的Java类,通过smartinvoke,该类的public 方法可以被Flex直接访问到。
点击eclipse 工具栏上的图标



  打开Create new smartinvoke type 对话框如下图所示:






点击完成后,会在First项目的cn.first包中新建一名称为ServiceTest的类。内容如下:
  1. package cn.first;
  2. import cn.smartinvoke.IServerObject;
  3. import cn.smartinvoke.ide.declare.AServiceType;
  4. @AServiceType
  5. public class ServiceTest implements IServerObject {
  6. public ServiceTest() {
  7.         //smarinvoke will call this default constructure.
  8. }
  9. public void gc(){
  10.      //when this service object not be used smartinvoke call this method free memory.
  11. }
  12. }
复制代码

然后我们在ServiceTest类中添加一简单的方法供Flex调用,如下:
  1. public String hello(String info){
  2.      System.out.println(info);
  3.      return "hello Flex I'm java";
  4. }
复制代码


我们会发现在ServiceTest类的申明处添加了@AServiceType注解,该注解的作用是告诉eclipse 可以将该类翻译成Flex可以直接调用的as代码。只有标记了@AServiceType注解的类eclipse才将其翻译为对应的as代码,所以如果想自定义一些调用逻辑可以将该注解注释掉。我们可以在关联的Flex项目First_的对应源代码目录cn/first下发现ServiceTest.as类,内容如下:

  1. package cn.first{
  2. import cn.smartinvoke.RemoteObject;
  3. [RemoteClass(alias="cn.first.ServiceTest")]
  4. public class ServiceTest extends RemoteObject{
  5. public static function CreateInstance0():ServiceTest{
  6. var instance:ServiceTest=new ServiceTest();
  7. instance.createRemoteObject(arguments);
  8. return instance;
  9. }
  10. public function hello(info:String):String{
  11.   var ret:Object=this.call('hello',arguments);
  12. return ret as String;
  13. }
  14. }
  15. }

  16. 细心观察下会发现ServiceTest.as类的方法与ServiceTest.java类的public 方法是一一对应的。
  17. 当Flex调用ServiceTest.as类中的hello方法时,其实是去调用对应的ServiceTest.java服务类中的hello方法,并获得对应返回值。
  18. 所以我们把ServiceTest.as类叫做:代理类型(Remote Class Type)。所有的代理类都继承了cn.smartinvoke.RemoteObject类。

  19. 修改First_项目的FirstWin.mxml文件的内容如下:
  20. <?xml version="1.0" encoding="utf-8"?>
  21. <si:SIApplication xmlns:mx="http://www.adobe.com/2006/mxml"
  22.      xmlns:si="http://smartinvoke.cn" creationComplete="init()"
  23.      layout="absolute" fontSize="12">
  24.      <mx:Script>
  25.         <![CDATA[
  26.             import cn.first.ServiceTest;
  27.             
  28.             import mx.controls.Alert;
  29.            private function init():void{
  30.                //创建对应的java服务类型对象         
  31.                var serv:ServiceTest=ServiceTest.CreateInstance0();
  32.                //调用java服务对象上的方法
  33.                var res:String=serv.hello("Hello Java I'm Flex");
  34.                
  35.                Alert.show(res);
  36.                //当我们不再使用该对象后,回收该服务对象的资源
  37.                serv.gc();
  38.            }
  39.         ]]>
  40.      </mx:Script>
  41. </si:SIApplication>
复制代码

        
和普通flex web applicationch程序运行方式一样,右键FirstWin.mxml将该文件运行为web应用程序就可以看到程序运行效果了。
细心的同学会发现这里的FirstWin.mxml并没有继承自mx.core.Application而是继承自:cn.smartinvoke.gui.SIApplication,SIApplication类,它封装了与Java通信的细节,使得SIApplication具有了访问Java对象的能力。在SmartInvoke中所有的窗口类都应该继承自SIApplication类。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:13:04 | 显示全部楼层
简介:

本篇为smartinvoke开发系列的第一篇,主要让大家对smartinvoke有一个整体的认识,能够开发出简单独立的smartinvoke可运行桌面程序。
创建SmartInvoke项目:依次选择Eclipse菜单栏中的 :文件 -> 新建 -> 其他 打开新建对话框,找到smartinvoke节点,选择New Project 节点,打开新建smartinvoke项目对话框,如下:
  




Project name 为项目名称;我们在这里输入:First
Main package 为项目入口类所在包名;我们在这里输入:cn.first
Class name 为项目入口类的类名称;我们在这里输入:FirstWin

输入完毕后点击完成,你会发现项目列表中新创建了两个项目,一个为Java类型项目,一个为Flex web application类型项目,结构如下图:







这两个项目构成了一个完整的smartinvoke项目First,它由Java类型项目First与Flex类型项目First_构成。Flex项目名称由Java项目名称加下划线”_”构成。通过这种项目名称的约定规则,smartInvoke IDE 将这两个项目关联在一起了。
这样一来,当调试或运行First_项目的FirstWin.mxml时,eclipse 不再是调用本机浏览器加载对应的swf了,而是调用关联的Java项目的入口类cn.first. FirstWin加载该swf。这样就实现了smartinvoke项目的开发与调试。Java项目First中的cn.first. FirstWin类是整个smartinvoke项目的入口类,它的main方法最先由jre调用执行。同时该类还控制着程序首先加载的swf文件的路径,程序打开主窗口的样式等。

通过将一个smartinvoke项目分割为两个相互关联的Java类型项目与Flex项目构成,这样使得程序的功能分工更加明确,Java负责逻辑,Flex负责界面显示。Java与Flex通信细节交由smartinvoke 完成。这样可以大大提高开发效率与代码的复用率。

创建服务类型(Service Class Type)实现Flex调用Java这里的服务类型即实现了cn.smartinvoke.IServerObject接口的Java类,通过smartinvoke,该类的public 方法可以被Flex直接访问到。
点击eclipse 工具栏上的图标



  打开Create new smartinvoke type 对话框如下图所示:






点击完成后,会在First项目的cn.first包中新建一名称为ServiceTest的类。内容如下:
package cn.first;
import cn.smartinvoke.IServerObject;
import cn.smartinvoke.ide.declare.AServiceType;
@AServiceType
public class ServiceTest implements IServerObject {
public ServiceTest() {
        //smarinvoke will call this default constructure.
}
public void gc(){
     //when this service object not be used smartinvoke call this method free memory.
}
}
然后我们在ServiceTest类中添加一简单的方法供Flex调用,如下:
public String hello(String info){
     System.out.println(info);
     return "hello Flex I'm java";
}

我们会发现在ServiceTest类的申明处添加了@AServiceType注解,该注解的作用是告诉eclipse 可以将该类翻译成Flex可以直接调用的as代码。只有标记了@AServiceType注解的类eclipse才将其翻译为对应的as代码,所以如果想自定义一些调用逻辑可以将该注解注释掉。我们可以在关联的Flex项目First_的对应源代码目录cn/first下发现ServiceTest.as类,内容如下:

package cn.first{
import cn.smartinvoke.RemoteObject;
[RemoteClass(alias="cn.first.ServiceTest")]
public class ServiceTest extends RemoteObject{
public static function CreateInstance0():ServiceTest{
var instance:ServiceTest=new ServiceTest();
instance.createRemoteObject(arguments);
return instance;
}
public function hello(info:String):String{
  var ret:Object=this.call('hello',arguments);
return ret as String;
}
}
}

细心观察下会发现ServiceTest.as类的方法与ServiceTest.java类的public 方法是一一对应的。
当Flex调用ServiceTest.as类中的hello方法时,其实是去调用对应的ServiceTest.java服务类中的hello方法,并获得对应返回值。
所以我们把ServiceTest.as类叫做:代理类型(Remote Class Type)。所有的代理类都继承了cn.smartinvoke.RemoteObject类。

修改First_项目的FirstWin.mxml文件的内容如下:
<?xml version="1.0" encoding="utf-8"?>
<si:SIApplication xmlns:mx="http://www.adobe.com/2006/mxml"
     xmlns:si="http://smartinvoke.cn" creationComplete="init()"
     layout="absolute" fontSize="12">
     <mx:Script>
        <![CDATA[
            import cn.first.ServiceTest;
            
            import mx.controls.Alert;
           private function init():void{
               //创建对应的java服务类型对象         
               var serv:ServiceTest=ServiceTest.CreateInstance0();
               //调用java服务对象上的方法
               var res:String=serv.hello("Hello Java I'm Flex");
               
               Alert.show(res);
               //当我们不再使用该对象后,回收该服务对象的资源
               serv.gc();
           }
        ]]>
     </mx:Script>
</si:SIApplication>
        
和普通flex web applicationch程序运行方式一样,右键FirstWin.mxml将该文件运行为web应用程序就可以看到程序运行效果了。
细心的同学会发现这里的FirstWin.mxml并没有继承自mx.core.Application而是继承自:cn.smartinvoke.gui.SIApplication,SIApplication类,它封装了与Java通信的细节,使得SIApplication具有了访问Java对象的能力。在SmartInvoke中所有的窗口类都应该继承自SIApplication类。
回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:40:11 | 显示全部楼层

smartinvoke入门系列3——程序的打包与单独运行

当然,SmartInvoke程序要能够方便的打包成类似exe可执行文件的形式才能算得上是一个真正的CS程序。

为了让SmartInvoke程序能够成功的打包运行,首先得在FirstWin.java入口类中添加一方法以指明程序所要加载的swf文件的路径。内容如下:

  1. public String getMainSWF(){
  2.        return"/FirstWin.swf";
  3. }
复制代码

该方法告诉SmartInvoke程序所需的swf文件为程序当前目录下的FirstWin.swf。

getMainSWF方法在这里可以返回相对于cn.smartinvoke.core.jar的相对路径,本地绝对路径,还有http地址。

注意该方法只是在程序打包导出的时候才使用,程序开发调试期间请把该方法注释掉。不然会导致调试程序无法运行。如果你不幸已经遇到这样的问题请重新启动eclipse.

右键First项目,选择导出 菜单,打开导出对话框,选择Java节点下的可运行的Jar文件节点。点击下一步,选择Jar文件加载后所要启动的java类,与Jar文件的存储位置,如下图:


  

点击完成按钮,会在C:cc目录下生成First.jar文件,将First_项目生成的FirstWin.swf文件及所需的运行时动态链接库文件拷贝到First.jar所在目录,新建一内容为java –jar First.jar的

Run.bat批处理文件。双击该批处理文件就可以运行我们的第一个smartinvoke程序啦。

程序的目录结构如下图:


运行smartinvoke自带的示例

在flash builder安装目录下的cn.smartinvoke.libs目录下一Demo开头的.bat文件都是可运行示例。




本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:42:21 | 显示全部楼层

smartinvoke入门系列4 ---- Java与Flex传递复杂类型

在Flex调用Java方法时,不仅可以传递基本数据类型,而且可以传递自定义复杂的数据类型。在这里我们把这种类型称作Bean Class Type,它的作用类似于J2EE里的Bean Class,只起着组织复杂数据的作用。
在eclipse 工具栏上点击
在Flex调用Java方法时,不仅可以传递基本数据类型,而且可以传递自定义复杂的数据类型。在这里我们把这种类型称作Bean Class Type,它的作用类似于J2EE里的Bean Class,只起着组织复杂数据的作用。
在eclipse 工具栏上点击

  图标,打开新建对话框,输入如下内容:



点击完成,eclipse会自动生成cn.First.BeanTest类,内容如下:

  1. package cn.first;  
  2.   
  3. import cn.smartinvoke.ide.declare.ABeanType;  
  4.   
  5. @ABeanType  
  6.   
  7. public class BeanTest{  
  8.   
  9. public BeanTest() {  
  10.   
  11. }  
  12.   
  13. }  
复制代码

@ABeanType标注告诉eclipse这是一个Bean Class Type,它的修改会同步到First_项目的cn/first/BeanTest.as文件中,以便Flex的调用。在这里BeanTest.as 与BeanTest.java对应。Flex调用方法时传递的BeanTest.as类型对象会在java端被smartinvoke解析为BeanTest.java类型对象处理,反过来也一样。

我们在BeanTest.java 中添加name属性如下:
  1. private String name;  
  2.   
  3.     public String getName() {  
  4.   
  5.         return name;  
  6.   
  7.     }  
  8.   
  9.     public void setName(String name) {  
  10.   
  11.         this.name = name;  
  12.   
  13.     }  
复制代码

打开BeanTest.as你会发现,该name属性也被同步到这里,如下:
  1. private var _name:String;  
  2.   
  3. public function set name(val:String):void{  
  4.   
  5.    this._name=val;  
  6.   
  7. }  
  8.   
  9. public function get name():String{  
  10.   
  11.    return this._name;  
  12.   
  13. }  
复制代码


我们在ServiceTest.java类中添加方法beanTest以便测试BeanTest类。内容如下:
  1. public void beanTest(BeanTest bean){  
  2.   
  3.      System.out.println(bean);  
  4.   
  5. }  
复制代码


打开First_项目中的ServiceTest.as文件会发现beanTest方法已被同步到这里,如下:
  1. public function beanTest(bean:BeanTest):void{  
  2.   
  3.   this.call('beanTest',arguments);  
  4.   
  5. }  
复制代码

在FirstWin.mxml中调用ServiceTest.as类的beanTest方法你会发现Flex传递的BeanTest对象会被传递到Java端。
在Bean Class Type类型中不仅可以定义基本的数据类型, 而且可以定义其他的Bean Class Type类型。当然Bean Class Type也可以继承其他的类。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有帐号?立即注册

x
回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:45:11 | 显示全部楼层

smartinvoke入门系列5——实现Java调用Flex


前面讲的都是Flex调用Java的情况,但是在某些时候需要Java调用Flex,比如,当Java某个后台任务执行完毕后应该调用Flex以便界面得到响应。
首先我们在Flex项目First_中新建一服务类cn.first.FlexService供Java调用,内容如下:
  1. package cn.first  
  2.   
  3. {  
  4.   
  5.     import cn.smartinvoke.ServerObject;  
  6.   
  7.      
  8.   
  9.     import mx.controls.Alert;  
  10.   
  11.    
  12.   
  13.     public class FlexService extends ServerObject  
  14.   
  15.     {  
  16.   
  17.         public function FlexService()  
  18.   
  19.         {  
  20.   
  21.             
  22.   
  23.         }  
  24.   
  25.         /**
  26.          *Java调用该方法在界面显示输入信息
  27.          */  
  28.   
  29.         public function showInfo(msg:String):void{  
  30.   
  31.             Alert.show(msg);  
  32.   
  33.         }  
  34.   
  35.     }  
  36.   
  37. }  
复制代码


在FirstWin.mxml中添加对FlexService类的变量申明,以便将FlexService类编译进FirstWin.swf文件中,供Java调用。
在Java项目First中新建FlexService.as类的对应代理类型FlexService.java,内容如下:
  1. package cn.first;  
  2.   
  3. import cn.smartinvoke.FlashContainer;  
  4.   
  5. import cn.smartinvoke.RemoteObject;  
  6.   
  7. public class FlexService extends RemoteObject {  
  8.   
  9. public FlexService(FlashContainer flashContainer) {  
  10.   
  11.         super(flashContainer);  
  12.   
  13.         //调用flex插件cn.first.FlexService类型服务对象,并将该对象与当前对象关联  
  14.   
  15.         this.nativeCreateObject("cn.first.FlexService");  
  16.   
  17. }  
  18.   
  19. /**
  20.   * 调用FlexService.as的showInfo方法
  21.   * @param msg
  22.   */  
  23.   
  24. public void showInfo(String msg){  
  25.   
  26.      this.call("showInfo",new Object[]{msg});  
  27.   
  28. }  
  29.   
  30. }  
复制代码


这里的FlashContainer对象负责加载当前需要访问的swf.
修改First项目中的FirstWin.java文件,在shell.open();代码的后面加入如下代码:
  1. final FlashContainer  container=shell.getFlashViewer().getFlashContainer();  
  2.   
  3.         container.addListener(new ILoadCompleteListener(){  
  4.   
  5.             //当flex加载完毕后会自动调用这里的方法.  
  6.   
  7.             @Override  
  8.   
  9.             public void run() {  
  10.   
  11.                 FlexService service=new FlexService(container);  
  12.   
  13.                 service.showInfo("Hello Flex");  
  14.   
  15.             }  
  16.   
  17.             
  18.   
  19.         });  
复制代码

回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:47:04 | 显示全部楼层

smartinvoke入门系列6——让Flex实现事件回调与多线程


本质上来说事件回调也是属于Java调用Flex。前面的Java调用Flex部分已经实现了该功能。但前面介绍的方式有些弊端:
1.  导致Java逻辑代码与Flex接口部分代码结合的比较紧密,降低了代码的可维护性。
2.  程序调用的smartinvoke API比较多,代码的可移植性不高。
在这里我们介绍smartinvoke的事件回调机制,可以解决上面遇到的两个问题。
首先修改First项目中的cn.first.ServiceTest类,让其继承
cn.smartinvoke.gui.module.CObservable类,CObservable类封装了事件回调的实现细节。增加callbackTest方法模拟后台长时间任务,修改后内容如下:
  1. package cn.first;
  2. import cn.smartinvoke.gui.module.CObservable;
  3. import cn.smartinvoke.ide.declare.AServiceType;
  4. @AServiceType
  5. public class ServiceTest extends CObservable {
  6. public ServiceTest() {
  7.         //smarinvoke will call this default constructure.
  8. }
  9. public String hello(String info){
  10.      System.out.println(info);
  11.      return "hello Flex I'm java";
  12. }
  13. public void beanTest(BeanTest bean){
  14.      System.out.println(bean);
  15. }

  16. public void callbackTest(){
  17.       //创建并启动一个新线程模拟后台任务
  18.       Thread thread=new Thread(){
  19.         public void run(){
  20.             for(int i=0;i<10;i++){
  21.                 System.out.println(i);
  22.                 try {
  23.                     Thread.sleep(800);
  24.                 } catch (InterruptedException e) {
  25.                 }
  26.             }
  27.             //当任务执行完毕后调用flex显示对应信息
  28.             ServiceTest.this.fireEvent("Task Finish");
  29.         }
  30.       };
  31.       thread.start();
  32. }
  33. public void gc(){
  34.      //when this service object not be used smartinvoke call this method free memory.
  35. }
  36. }
复制代码



保存编译后你会发现First_项目中的ServiceTest.as文件也做了相应的修改,内容如下:

  1. package cn.first{
  2. import cn.smartinvoke.gui.module.CObservable;
  3. import cn.first.BeanTest;
  4. import cn.smartinvoke.RemoteObject;
  5. [RemoteClass(alias="cn.first.ServiceTest")]
  6. public class ServiceTest extends CObservable{
  7. public static function CreateInstance0():ServiceTest{
  8. var instance:ServiceTest=new ServiceTest();
  9. instance.createRemoteObject(arguments);
  10. return instance;
  11. }
  12. public function hello(info:String):String{
  13.   var ret:Object=this.call('hello',arguments);
  14. return ret as String;
  15. }
  16. public function beanTest(bean:BeanTest):void{
  17.   this.call('beanTest',arguments);
  18. }
  19. public function callbackTest():void{
  20.   this.call('callbackTest',arguments);
  21. }
  22. }
  23. }
复制代码

Flex中通过以下代码就可以看到效果了。
  1. //创建ServiceTest服务对象
  2.                var serv:ServiceTest=ServiceTest.CreateInstance0();
  3.                //添加事件监听器
  4.                serv.addListener(function(res:Object):void{
  5.                    Alert.show(res+"");
  6.                },this);
  7.                //调用任务方法,启动后台线程
  8.                serv.callbackTest();
复制代码




回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 14:57:24 | 显示全部楼层

smartinvoke入门系列7——让Flex捕获键盘组合键

在FirstWin.mxml中通过调用addKeyBoardListener方法可以设置键盘监听器,该方法在cn.smartinvoke.gui.SIApplication类中定义,方法说明如下:
public function addKeyBoardListener(listener:Function, target:Object, vk1:int = -1, vk2:int = -1, vk3:int = -1, characher:String = null):void

listener:Function      快捷键触发后的回调函数
         target:Object         回调函数中this关键字所指代的对象
         vk1:int (default = -1)   第一个虚拟键
         vk2:int (default = -1)   第二个虚拟键
         vk3:int (default = -1)   第三个虚拟键
         characher:String (default = null)   字符键
如:在FirstWin.mxml中添加如下代码就可以实现键盘监听,

  1. this.addKeyBoardListener(function():void{  
  2.   
  3. Alert.show(“按下了ESC+E”);},this,VirtualKeys.VK_ESCAPE,-1,-1,"E");  
  4.   
  5.    
  6.   
  7. this.addKeyBoardListener(function():void{  
  8.   
  9. Alert.show(“按下了C”);},this,-1,-1,-1,"C");  
  10.    
  11.   
  12. this.addKeyBoardListener(function():void{  
  13.   
  14. Alert.show(“按下了ESC+E”);},this,VirtualKeys.VK_ESCAPE,-1,-1,"E");  
  15.   
  16.    
  17.   
  18. this.addKeyBoardListener(function ():void{  
  19.   
  20.                                         Alert.show("你按下了 control + shift +K");  
  21.   
  22. },this,VirtualKeys.VK_CONTROL,VirtualKeys.VK_SHIFT,-1,"K");  
复制代码

回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 15:01:01 | 显示全部楼层

smartinvoke入门系列8——Flex本地右键菜单

SmartInvoke屏蔽了Flash中的系统内置右键,添加了系统本地右键菜单功能。只需几段代码就可以创建出本地右键菜单。右键菜单主要用到以下四个类:

cn.smartinvoke.gui.control.CAction;           

菜单项信息类,封装了菜单项的id,菜单项的显示文字,菜单项的图标,菜单项类型等信息。

cn.smartinvoke.gui.control.CNativeMenuBuilder

本地菜单类,该对象表示一个菜单。他由菜单项CAction与CMenuRelation组成。

cn.smartinvoke.gui.module.CActionEvent;

菜单的点击事件类,单用户点击了某个菜单项后,smartinvoke就会派发这个事件。

cn.smartinvoke.gui.CContextMenuManager

菜单管理器,用户不能单独创建该类,该类是SIApplication对象的成员,管理着当前窗口总的所有菜单对象。每个菜单都要与某个显示控件相关联,不可能独立存在,所以菜单管理器在这里还维护这菜单与显示控件的关联关系。

cn.smartinvoke.gui.module.CMenuRelation;

菜单项组织者,该对象将多个菜单项组织成一个菜单。然后通过CContextMenuManager与指定控件关联。

下面我们就来简单的实现一个本地菜单。在First_项目的FirstWin.mxml的init方法中增加如下内容:


  1. //菜单的实现

  2.                //构造三个菜单项

  3.                var act1:CAction=new CAction("action1","菜单一");//action1为第一个菜单项的id

  4.                var act2:CAction=new CAction("action2","第二个菜单");

  5.                var act3:CAction=new CAction("about","关于smartinvoke");

  6.                //构造菜单对象

  7.                var menu:CNativeMenuBuilder=new CNativeMenuBuilder(this.shell);

  8.                //将菜单项数组传递给菜单对象

  9.                menu.initAction([act1,act2,act3]);

  10.                //组织菜单项之间的关系

  11.                var subRel:CMenuRelation=new CMenuRelation();

  12.                subRel.actions=[act2.actionId];

  13.                subRel.label="子菜单";

  14.                var rel:CMenuRelation=new CMenuRelation();

  15.                rel.actions=[act1.actionId,subRel,"-",act3.actionId];

  16.               

  17.                menu.initMenu(rel);

  18.                //添加事件监听器

  19.                menu.addListener(function (evt:CActionEvent):void{

  20.                    this.labelInfo.text="您点击了菜单"+evt.actionId+" 菜单路径:"+evt.path;

  21.                },this);

  22.               

  23.                //将当前创建的菜单,关联到当前SIApplication应用程序对象上,

  24.                //当然你可以关联到任何InteractiveObject类型对象上

  25.                this.contextMenuManager.addNativeMenu(this,menu);
复制代码


当然我们也可以通过调用CNativeMenuBuilder类的addAction与addMenuItem两个方法动态的添加一菜单项到菜单对象中。


addAction(cAction:CAction):void       作用为添加一菜单项实体对象。

addMenuItem(actionId:String, path:String):void 将菜单项添加到菜单path所指定的显示位置上,这里的path由CMenuRelation对象的label属性加反斜杠/组成。



菜单项全屏的path为空字符串,菜单项:简体中文(GB18030)的path为:字符编码(C),菜单项:东亚 的path为:字符编码(C)/自动检测(A)


也可以调用CNativeMenuBuilder类的removeMenuItem(actionId:String, path:String):void方法删除指定位置上的菜单项。

当然CNativeMenuBuilder类还有设置菜单项状态,菜单项显示文字等方法,请参考中文API。


回复

使用道具 举报

76

主题

131

帖子

1万

积分

管理员

Rank: 9Rank: 9Rank: 9

积分
17958
 楼主| 发表于 2017-7-7 15:03:09 | 显示全部楼层

smartinvoke入门系列9——窗口类型FlashShell与事件

SmartInvoke使用cn.smartinvoke.gui.shell.FlashShell类管理应用程序打开的窗口,通过该对象,用户可以设置窗口的标题,位置,大小,是否可以,透明度等属性,还可以监听窗口的
CShellEvent.Event_Activated,CShellEvent.Event_Closed,CShellEvent.Event_Deactivated, CShellEvent.Event_Deiconified,CShellEvent.Event_Iconified事件。每个打开的窗口有且只有一个该对象,通过cn.smartinvoke.gui.SIApplication对象的shell属性可以获得该对象的句柄。
比如在First_项目的FirstWin.mxml文件中添加如下代码就可以实现关闭询问对话框的功能:
  1. //添加关闭监听器  
  2.   
  3.                this.shell.addShellListener(CShellEvent.Event_Closed,function(evt:CShellEvent):void{  
  4.   
  5.                    Alert.show("do you want to exist!","select dialog",Alert.YES|Alert.NO,this,  
  6.   
  7.                        this.clickSelectHandler,null,1);  
  8.   
  9.                },this);  
  10.   
  11.    
  12.   
  13. private function clickSelectHandler(evt:CloseEvent):void{   
  14.   
  15.                 if(evt.detail==Alert.YES){  
  16.   
  17.                     this.shell.close();  
  18.   
  19.                 }  
  20.   
  21.            }  
复制代码


FlashShell类的更多属性请参考API
http://smartrcp.org/doc/flex

回复

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|12321官方游戏论坛  

GMT+8, 2024-3-28 17:04 , Processed in 0.023592 second(s), 25 queries .

Powered by Discuz! X3.4

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表