InvokeUI是一个Java桌面程序开发框架。
它将Flex界面API进行Java本地封装,以实现用Java快速构建
漂亮桌面程序的目的。InvokeUI框架构建于SmartInvoke之上,整个
系统结构如下:

SmartInvoke:
提供Java与Flash互调的功能,它是InvokeUI功能得以实现的核心。
项目地址:http://smartinvoke.cn
Swt :
SmartInvoke与InvokeUI都是构建在Swt之上的,它是基础。
InvokeUI的目标:
- 使Java程序员在完全不懂Flex的情况下也可以快速写出漂亮的客户端程序。
- 支持第三方Flex 库的动态加载,以增强标准flex库的功能。
- 支持将第三方Flex API自动转换为对应jar库文件,方便java调用。
- 完全针对swf进行动态调用,避开Flex SDK编译花费的时间,使程序开发更敏捷更愉快
- 支持类似mxml的界面定义语言,快速构建程序界面
演示程序截图:
听起来有点儿玄乎上图上源代码让大家信服

示例程序运行效果如下图:

嘿嘿,看起来有点儿流口水吧,此示例程序的源代码为一个eclipse java项目的压缩包,已上传到附件中。下面来讲解下本示例
程序的结构及代码。
示例程序的项目名称为DemoIUI,test.IUIDemoTester为项目的入口类,执行他的main方法就可以运行示例程序了。
swfs目录下为InvokeUI运行时需要载入的swf文件及图片。
libs目录下为本项目引用的外部库
flex.jar为flex的Java封装库。
invokeUI.jar为 InvokeUI框架的核心库,cn.smartinvoke.core.jar为smartinvoke通信库,其他为swt/jface库。
从这些库中你可以发现InvokeUI是构建在swt与smartinvoke之上的。
test.MainShell类为示例程序的主窗口,他继承自IUIShell,当swf载入完毕后,flex就准备好接受Java的调用了,但是现在窗口
还是白白的什么都没有,所以我们在loadComplete方法中添加界面的创建代码,添加一些控件到窗口之上。
代码如下:
protected void loadComplete() {
//设置Application布局
app.setStyle("verticalAlign", "middle");
/**
* 通过调用wm变量的create方法,调用flex创建一个ToggleButton按钮,
* wm在这里为WidgetManager类型对象,java是通过他实现对flex的调用
* 的
*/
ToggleButton toggleButton=wm.create(ToggleButton.class);
toggleButton.setLabel("点击改变程序外观");
toggleButton.setWidth(200);
toggleButton.setHeight(50);
/**
* app为mx.core.Application类型对象,熟悉Flex的朋友知道他是一个
* 顶层对象,是整个窗口显示控件树的根
*/
app.addChild(toggleButton);
//添加click监听器
toggleButton.addClickListener(new MouseEventListenerAdapter(){
//这里的皮肤swf由flash builder导出
String path=Environment.getLocation()+"/styles/spark_cobalt.swf";
public void click(MouseEvent e) {
ToggleButton target=(ToggleButton)e.getCurrentTarget();
System.out.println(target);
}
});
}
怎么样,是不是感觉跟swing比较像呢?
创建表格:
//创建表格并设置样式
final DataGrid dataGrid=wm.create(DataGrid.class);
dataGrid.setPercentHeight(100);
dataGrid.setPercentWidth(100);
dataGrid.setRowHeight(30);
//设置itemRenderer的meta信息
List<Object> data=new ArrayList<Object>();
FlexObject metaObj=new FlexObject();
metaObj.put("c2", DataGridRendererComponent.class.getName());
//构造数据
for(int i=0;i<800;i++){
Map<String,Object> map=new HashMap<String, Object>();
map.put("c1", ""+i);
map.put("c2", "第二列_"+i);
map.put("c3", "第三列_"+i);
map.put(IUIConstants.META_TYPE_PROPERTY_NAME, metaObj);
data.add(map);
}
dataGrid.setDataProvider(data);
//设置第一列
DataGridColumn c1=wm.create(DataGridColumn.class);
c1.setHeaderText("c1Text");
c1.setDataField("c1");c1.setWidth(200);
//设置列的格式化函数
c1.setLabelFunction(new FlFunction(){
@Override
public Object execute(Object[] params) {
//Object[] pars=(Object[])params[0];
FlexObject obj=(FlexObject)params[0];
String idVal=obj.get("c1")+"";
return "编号:"+idVal;
}
});
//设置第二列
DataGridColumn c2=wm.create(DataGridColumn.class);
c2.setHeaderText("c2Text");
c2.setDataField("c2");
//设置表格列的自定义渲染类
c2.setItemRenderer(new RendererType(DataGridRendererComponent.class));
//设置第三列
DataGridColumn c3=wm.create(DataGridColumn.class);
c3.setHeaderText("c3Text");
c3.setDataField("c3");
dataGrid.setColumns(new Object[]{c1,c2,c3});
//添加事件
dataGrid.addCreationCompleteListener(new FlexEventListenerAdapter(){
@Override
public void creationComplete(FlexEvent e) {
DataGrid grid=(DataGrid)e.getCurrentTarget();
System.out.println(grid+"创建完毕...");
}
});
//添加表格列选择事件
dataGrid.addChangeListener(new ListEventListenerAdapter(){
public void change(ListEvent e) {
System.out.println(e);
}
});
加载外部API:
//首先获得样式管理器
SuperWidget styleManager=app.getStyleManager();
//获得外部API的样式文件,这里的样式文件已经编译为swf了,在flex开发中他们是css文件
final String path=Environment.getLocation()+"/map/styles.swf";
//调用样式管理器对象的loadStyleDeclarations2方法加载样式,并返回evtDispatch加载事件对象
SuperWidget evtDispatch=(SuperWidget)wm.
callFunction(styleManager.id, "loadStyleDeclarations2", new Object[]{path,true,ApplicationDomain.getCurrentDomain(wm)});
//样式文件加载过程中的事件监听器对象
StyleEventListenerAdapter listener=new StyleEventListenerAdapter(){
public void error(StyleEvent e) {
System.out.println("样式文件"+path+" 加载出错");
}
public void complete(StyleEvent e) {
System.out.println("样式文件"+path+" 加载完毕");
//加载外部API中所有类型定义所在的swf,在java中这里就像是加载某个jar库文件
String url=Environment.getLocation()+"/map/ESRI_API.swf";
SuperWidget moduleInfo=(SuperWidget)ModuleManager.getModule(wm, url);
moduleInfo.addListener(ModuleEvent.READY, new ModuleEventListenerAdapter(){
@Override
public void ready(ModuleEvent e) {
//API加载完毕后调用对应的API显示地图
SuperWidget map=wm.create("com.esri.ags.Map");//创建map地图对象
SuperWidget layer=wm.create("com.esri.ags.layers.ArcGISTiledMapServiceLayer");//创建一个地图图层
wm.setProp(layer.id,"url","http://server.arcgisonline.com/ArcGIS/rest/services/World_Street_Map/MapServer" );
wm.callFunction(map.id, "addLayer",new Object[]{layer});//添加图层
//将map地图控件添加到app中显示出来
wm.addChild(app.id, map.id);
}
public void error(ModuleEvent e) {
System.out.println("模块加载错误");
}
});
//加载模块
wm.callFunction(moduleInfo.id, "load",
new Object[]{ApplicationDomain.getCurrentDomain(wm)});
}
};
//添加加载完毕监听器
evtDispatch.addListener(StyleEvent.COMPLETE, listener );
//添加加载错误监听器
evtDispatch.addListener(StyleEvent.ERROR, listener);
其实InvokeUI的实现原理与swt非常相似,要想知道完整代码请查看附件。
ps:InvokeUI的下一步开发计划包括:
1.继续稳定与完善InvokeUI核心库
2.实现用xml构建界面与IDE界面设计器
InvokeUI承诺完全免费使用,目前正处在功能完善阶段,欢迎大家多提宝贵意见

- 大小: 5.9 KB

- 大小: 205.1 KB
分享到:
相关推荐
# 压缩文件中包含: 中文-英文对照文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文-英文对照文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
SQLite3的使用+API接口的调用(c/c++、Qt)
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文介绍了如何使用混沌-高斯变异-麻雀搜索算法(CGSSA)优化BP神经网络来进行电力行业的回归预测。主要内容包括数据准备、BP神经网络构建、CGSSA优化过程、以及优化前后效果对比。通过MATLAB代码实现,展示了如何读取EXCEL数据并进行训练和测试,最终通过图表和误差指标对比优化前后的预测效果。 适用人群:适用于具有一定MATLAB编程基础和技术背景的研究人员、工程师,特别是从事电力数据分析和机器学习领域的专业人士。 使用场景及目标:① 对电厂运行数据进行精准回归预测,辅助电厂运维规划和能源分配优化;② 提供详细的代码实现和优化方法,帮助用户理解和应用CGSSA优化BP神经网络的技术。 其他说明:文中提供了完整的代码示例,包括主程序、数据划分、BP神经网络预测、CGSSA-BP神经网络预测和结果对比等功能模块。此外,还讨论了一些优化技巧和注意事项,如数据归一化、隐藏层节点选择等。
第三方浏览器下载包.apk
嵌入式系统开发_ARM11架构_Linux操作系统_QT48开发环境_QTCreator工具_人脸识别算法_商业保密技术_QML界面开发_视频嵌入技术_跨平台移植_基于上海高校
宠物领养救助系统是基于SpringBoot+MyBatisPlus+Vue+MySQL开发的Java项目,适合作为Java课程设计、毕业设计或期末大作业。技术涵盖前后端开发,帮助初学者快速掌握Java全栈技能。采用IDEA开发,代码规范,易于二次扩展,是Java学习者的理想实战项目!
winmm钢琴程序代码QZQ
scratch少儿编程逻辑思维游戏源码-狗狗变形者.zip
# 压缩文件中包含: 中文文档 jar包下载地址 Maven依赖 Gradle依赖 源代码下载地址 # 本文件关键字: jar中文文档.zip,java,jar包,Maven,第三方jar包,组件,开源组件,第三方组件,Gradle,中文API文档,手册,开发手册,使用手册,参考手册 # 使用方法: 解压最外层zip,再解压其中的zip包,双击 【index.html】 文件,即可用浏览器打开、进行查看。 # 特殊说明: ·本文档为人性化翻译,精心制作,请放心使用。 ·只翻译了该翻译的内容,如:注释、说明、描述、用法讲解 等; ·不该翻译的内容保持原样,如:类名、方法名、包名、类型、关键字、代码 等。 # 温馨提示: (1)为了防止解压后路径太长导致浏览器无法打开,推荐在解压时选择“解压到当前文件夹”(放心,自带文件夹,文件不会散落一地); (2)有时,一套Java组件会有多个jar,所以在下载前,请仔细阅读本篇描述,以确保这就是你需要的文件;
内容概要:本文详细介绍了基于回声状态网络(ESN)的数据分类预测方法及其Matlab实现。首先简述了ESN的基本概念,强调其作为特殊递归神经网络的特点,即储备池连接权值固定不变。接着逐步展示了从数据准备、ESN模型构建、训练到预测的具体步骤,包括参数设置、状态更新规则、输出层训练方法等。文中还探讨了各部分代码的作用及意义,并提供了调参建议,如谱半径、泄漏率等参数的选择依据。此外,作者分享了自己在实验过程中的一些经验和心得,指出ESN在处理时间序列分类任务方面的优势。 适合人群:对递归神经网络特别是ESN感兴趣的科研工作者、学生以及有一定编程基础并想深入了解ESN机制的研究人员。 使用场景及目标:适用于需要进行时间序列数据分析和分类的应用场合,如金融趋势预测、语音识别等领域。通过学习本文提供的完整流程,读者可以掌握如何利用ESN解决实际问题,并能够根据自身需求调整模型参数以获得更好的性能。 其他说明:文中不仅给出了完整的Matlab代码示例,而且针对每一环节进行了详细的解释,帮助读者更好地理解ESN的工作原理和技术细节。同时提醒读者注意某些关键参数的调节范围,以便于在实际项目中取得理想的效果。
内容概要:本文深入介绍了威纶通触摸屏一机多屏程序及其与FX3U系列PLC和MODBUS通讯的集成应用。首先,文章阐述了系统的硬件架构,即一个FX3U系列PLC搭配四个MT6051ip触摸屏的工作原理。接着,详细解析了威纶通模板的特点,特别是梯形图的详尽注释,便于理解和维护。此外,文章还探讨了PLC与上位机的MODBUS通讯设置,包括波特率、数据位、停止位等参数的具体配置方法。最后,强调了该系统的学习意义和借鉴价值,适用于新手和资深工程师。 适合人群:从事自动化控制领域的工程师和技术人员,尤其是那些希望深入了解PLC、触摸屏和MODBUS通讯的人群。 使用场景及目标:①帮助工程师快速掌握威纶通触摸屏的一机多屏配置;②提高PLC与触摸屏、上位机之间的通讯效率;③优化中小型企业生产线的监控系统,提升生产效率和稳定性。 其他说明:文中提供的实例和代码片段有助于读者更好地理解和实践相关技术,同时附带了一些实用的小技巧,如心跳检测和双看门狗设计,增强了系统的可靠性和容错能力。
无人机航测_大疆航线规划_KMZ文件生成与解析_基于JavaXStream注解的DJIPilot2兼容航线文件处理工具_支持航点飞行建图航拍等多种任务模板_包含航线高度速度航向角失
内容概要:本文详细介绍了蒙特卡洛方法在工程可靠度计算中的应用,特别是在处理涉及多种概率分布参数的情况下。首先展示了基本的Matlab实现,如生成正态分布和极值分布的随机样本,并通过极限状态函数判断结构的安全性。接着讨论了处理相关变量的有效方法——拉丁超立方抽样,以及进一步提高计算效率的重要抽样法。此外,还探讨了并行计算和置信区间的计算,确保结果的准确性。最后强调了蒙特卡洛方法在解决复杂可靠度问题中的优越性和实用性。 适合人群:从事工程可靠度分析的研究人员和技术人员,以及对数值模拟感兴趣的工程师。 使用场景及目标:适用于需要评估结构或其他系统的可靠性的场合,尤其是在无法获得解析解的情况下。目标是提供一种简单有效的数值方法来估算失效概率和可靠度。 其他说明:文中提供了大量具体的Matlab代码示例,帮助读者更好地理解和应用蒙特卡洛方法。同时提醒使用者注意计算资源的合理分配,以平衡精度和效率。
基于SpringBoot+MyBatisPlus+Vue+MySQL的人力资源管理系统,专为Java课程设计、毕业设计及期末大作业打造。采用主流技术栈(Idea开发),适合Java初学者快速上手,提供完整源码与文档,助力高效完成学习任务!
Screenshot_2025-01-26-01-50-08-41.jpg
内容概要:本文详细介绍了如何利用FPGA和Verilog HDL语言实现一个多功能DDS(直接数字频率合成)信号发生器。该发生器不仅可以生成常见的正弦波、方波、锯齿波和三角波,还可以实现2PSK、2ASK和AM调制。文章首先解释了DDS的基本原理,即通过相位累加器和查找表(LUT)生成波形。接着分别给出了各个波形的具体实现代码,并讨论了调制技术的实现方法。最后,文章提供了仿真的步骤以及一些实用的调试技巧,确保设计方案能够在实际硬件环境中正常工作。 适合人群:具备一定FPGA和Verilog编程基础的电子工程师、研究人员和技术爱好者。 使用场景及目标:适用于需要精确控制频率和波形的应用场合,如通信系统、音频设备、测试仪器等。目标是掌握DDS技术的工作原理及其在FPGA上的具体实现方法,同时提高对复杂数字系统的理解和设计能力。 其他说明:文中提供的代码片段可以直接用于实验环境,有助于快速搭建原型并进行验证。此外,作者还分享了一些优化建议和常见问题解决方案,使读者能够更好地应对实际项目中的挑战。
34 andorid 源码北京公交线路查询
内容概要:本文深入介绍了Linux XFRM框架在网络安全中的作用及其工作机制。XFRM框架作为Linux内核中的关键组件,主要用于保障网络通信的安全性,特别是在数据加密、认证和完整性验证方面。文章首先阐述了网络安全的重要性,接着详细解释了XFRM框架的基本概念、与IPsec的关系及其发展历程。随后,文章剖析了XFRM框架的核心组件,包括数据接收协议(AH和ESP)、数据发送协议和策略引擎,并详细描述了数据发送、接收和转发的具体流程。文中还重点讲解了安全关联(SA)、安全策略(SP)和netns_xfrm结构等关键技术点。最后,文章总结了XFRM框架的优势,如高扩展性、对网络命名空间的支持以及与现有架构的融合,并探讨了其在企业网络安全、容器网络安全和VPN连接中的应用场景。 适合人群:对网络安全和Linux内核技术有一定了解的技术人员,尤其是从事网络开发、安全管理和系统运维的专业人士。 使用场景及目标:①理解XFRM框架在Linux内核中的作用及其与IPsec的关系;②掌握XFRM框架的核心组件和工作原理,如数据接收、发送和转发流程;③学习如何利用XFRM框架为企业网络、容器网络和VPN连接提供安全保障。 其他说明:XFRM框架不仅支持IPv4和IPv6协议,还具备高度的扩展性和灵活性,能够适应未来网络技术的发展,如量子安全加密算法和物联网设备的安全需求。文章鼓励读者进一步研究XFRM框架的源代码和相关文档,以探索更多技术细节。