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
分享到:
相关推荐
汉堡市场调研报告:2023年市场规模约为1890亿元 在快节奏的现代生活中,汉堡以其便捷、快速且标准化的特点,成为了大众日常饮食的重要选择。然而,随着消费者对健康、口味和文化认同感的追求日益提升,传统西式汉堡已难以满足所有消费者的需求。在此背景下,中式汉堡应运而生,以其独特的口味和文化内涵,迅速赢得了市场的青睐。那么,中式汉堡市场究竟蕴含着怎样的增长潜力?又该如何把握这一市场机遇呢? 市场概况: 近年来,中国西式快餐市场规模持续扩大,2023年已达到约3687.8亿元。其中,汉堡作为西式快餐的代表之一,市场规模约为1890亿元,占据了西式快餐最大的市场份额。值得注意的是,中式汉堡品牌异军突起,凭借其独特的口味和文化内涵,迅速在市场上站稳脚跟。截至2024年11月,全国中式汉堡门店数已近2万家,展现出强劲的增长势头。 技术创新与趋势: 中式汉堡的成功,离不开技术创新和趋势把握。一方面,中式汉堡品牌通过结合中式烹饪方式,推出了更符合中国消费者口味的产品,如加入秘制酱料、使用传统烹饪技艺等,使汉堡更加美味可口。另一方面,中式汉堡品牌还注重数智化转型,通过运用大数据、人工智能等先进技术,实现精
* GPS IMU经典15维ESKF松组合 * VRU/AHRS姿态融合算法 * 捷联惯导速度位置姿态解算例子 * UWB IMU紧组合融合 * 每个例子自带数据集
Docker以及Docker-Compose的安装与卸载 适合开发下运维人员学习
尚硅谷宋红康C语言精讲.zip
内容概要:本文提出了一种结合生物信息学、遥感技术和物联网技术的水果虫灾智能检测系统。通过收集和分析生物标志物、遥感影像和传感器数据,利用机器学习算法实现对虫灾的自动识别与预警,提高检测的准确性和时效性,为水果种植业的可持续发展提供支持。 适合人群:农业科学家、农艺师、农业技术开发人员。 使用场景及目标:适用于水果种植园的虫害监控,帮助农民及时发现和控制虫灾,减少农业生产损失。 其他说明:该系统不仅提高了虫灾检测的效率,还在一定程度上解决了传统方法耗时费力、准确性低的问题。系统未来将优化数据处理方法、提取更多有效特征,并尝试应用到其他农业领域。
南平市2005-2024年近20年的历史气象数据,每3小时更新一次数据,参数包含气温、气压、降水量、云层、能见度、风向、湿度等,几万条数据
数据结构上机实验大作业-线性表选题.zip
弱电人需要的网络基础知识汇总.docx
本数据集记录了不同环境条件下植物生长数据信息。分析这些数据可以了解到,随着时间的推移,不同的温度、湿度、pH值和总溶解固体(TDS)等因素如何影响植物的生长发展。 数据说明: Plant_ID 每株植物的标识符 Date 观测日期 Temperature (°C) 温度,以摄氏度为单位 Humidity (%) 湿度水平,以百分比表示 TDS Value (ppm) 总溶解固体值,以百万分之一(ppm)为单位 pH Level 环境的pH值 Growth Days 植物从开始生长到完全长成所需的天数
字幕网页文字检测20-YOLO(v5至v11)、COCO、CreateML、Paligemma、TFRecord、VOC数据集合集.rarLLCMTVRC-V2 2024-05-04 11:24 PM ============================= *与您的团队在计算机视觉项目上合作 *收集和组织图像 *了解和搜索非结构化图像数据 *注释,创建数据集 *导出,训练和部署计算机视觉模型 *使用主动学习随着时间的推移改善数据集 对于最先进的计算机视觉培训笔记本,您可以与此数据集一起使用 该数据集包括161张图像。 随机文本以可可格式注释。 将以下预处理应用于每个图像: *像素数据的自动取向(带有Exif-Arientation剥离) *调整大小为640x640(拉伸) 应用以下扩展来创建每个源图像的3个版本: *随机裁剪图像的0%至30% * -16至+16度之间的随机旋转 将以下转换应用于每个图像的边界框: *水平的-3°至 +3°之间的随机剪切和-4°至 +4°垂直剪切
冒泡排序
KeyboardInterrupt
C语言是一种强大的、通用的编程语言,被广泛用于系统编程、应用编程、嵌入式系统以及游戏开发等领域。它的简洁性和高效性使得它成为初学者和专业人士的首选语言。"经典C程序100例"这个资源是学习C语言的一个宝贵资料库,包含了多种常见问题的解决方案和编程技巧。 C语言的基础知识包括变量、数据类型、运算符、流程控制(如if语句、switch语句、循环结构for、while、do-while)以及函数的使用。这些基础知识在每个C程序中都不可或缺。例如,通过学习不同的数据类型(如int、char、float、double等),我们可以理解如何存储和处理不同类型的数据。而流程控制则帮助我们根据条件执行不同的代码段,实现逻辑判断和重复执行。 在C语言中,函数是代码组织的基本单元,可以实现代码复用和模块化。通过阅读和分析100个经典实例,我们可以看到如何定义和调用函数,以及如何传递参数和返回值。此外,指针是C语言的一大特色,它允许我们直接操作内存,提高程序的灵活性和效率。学习如何声明、初始化和使用指针是掌握C语言的关键。 结构体和联合体是C语言中复合数据类型,它们能将多个不同类型的数据组合成一个整体。在经
时变动态分位数CoVaR、delta-CoVaR,分位数回归 △CoVaR测度 溢出效应 动态 Adrian2016基于分位数回归方法计算动态条件在险价值。 R语言代码,代码更数据就能用,需要修改的地方都已标明,并且举例怎么修改 每一行代码都有注释,一次可以计算出所有结果,不需要像Eviews一样两两重复计算。 例子为31家金融机构11-22年数据,包含4个宏观状态变量,计算结果见下图。
【资源说明】 基于Bmob校园签到系统全部资料+详细文档+高分项目.zip 【备注】 1、该项目是个人高分项目源码,已获导师指导认可通过,答辩评审分达到95分 2、该资源内项目代码都经过测试运行成功,功能ok的情况下才上传的,请放心下载使用! 3、本项目适合计算机相关专业(人工智能、通信工程、自动化、电子信息、物联网等)的在校学生、老师或者企业员工下载使用,也可作为毕业设计、课程设计、作业、项目初期立项演示等,当然也适合小白学习进阶。 4、如果基础还行,可以在此代码基础上进行修改,以实现其他功能,也可直接用于毕设、课设、作业等。 欢迎下载,沟通交流,互相学习,共同进步!
python编译器Anaconda安装包下载(含各种版本)
内容概要:本文详细介绍了冒泡排序的基本原理及其实现方式,并提供了Java和Python两种语言的代码样例。首先解释了冒泡排序的工作机制,即通过重复遍历数组、比较相邻元素并在必要时进行交换来逐步将最大值移动到数组末尾,直至整个数组有序。文中给出的具体实现包括了标记法,可以在当前遍历过程中没有发生任何交换时提前终止排序过程,提高效率。此外,文中还提供了测试用的数据集及打印排序后的结果。 适合人群:适合计算机科学专业的初学者或者对基本排序算法有兴趣的技术人员。 使用场景及目标:可用于教学目的,帮助学生理解和掌握冒泡排序算法的原理及具体编程实现方法;同时,对于有经验的开发者来说,也是一个很好的复习材料。 阅读建议:建议读者跟随文章内容尝试动手实现相应的冒泡排序算法,并理解每一步操作的目的,以加深理解。
计算机接口实验报告,环境:PC 机一台,TD-PITE 实验装置一套。报告内容有,实验目的、实验设备、实验内容、实验步骤、实验程序(汇编)、实验结果、实验总结,一步到位!!!!!! 一步到位!!!!!!
15 unit 11.mp3
智慧校园数字孪生,三维可视化