电脑故障

位置:IT落伍者 >> 电脑故障 >> 浏览文章

轻松从VB转向基于Swing的开发平台


发布日期:2020/3/30
 
当Abacus Research AG一家商业软件开发公司决定将开发平台从 Borland 的 Delphi 转向Java Swing时它发现自己站在了软件开发的十字路口

我们大量的应用程序开发团队拥有多年的Delphi GUI开发经验却没有任何的Java/Swing 经验并且我们需要在极短的时间内将大量的Delphi应用程序转换为Swing在研究了当时可用的GUI工具后我们觉得我们应该通过赞助一个GPL开源Java GUI编译器来达到自己的目标而且这个编译器还可以帮助其他的应用程序开发者面对相同的挑战

AbaGUIBuilder Abacus Java GUI编译器被设计用来实现轻松地从VB或Delphi开发转向Java Swing这一策略帮助Abacus Research实现了其Java版应用程序的交付缩短了开发时间使其开发人员把精力投向商业应用而不是Swing框架的错综复杂

如图所示AbaGUIBuilder有能够在许多其他开发环境如VB和Delphi找到的要素位于视窗左上角是活动对象树其下是Swing组件选择区位于视窗的中上部是开发面板或者说是画布在这里放入Swing组件将其实例化在右上部是属性编辑器下部是事件面板包括两个制表符页分别是事件代码编辑器为每个单独的可视对象添加事件代码和消息面板显示AbaGUIBuilder的状态消息

Abacus GUI编译器

为什么做我们自己的GUI工具?

为什么我们选择写自己的工具?开始我们决定我们的工具应该包括以下五个要求

容易使用

不需要布局管理器的使用经验

不需要Swing的使用经验

不需要输出Swing代码

实现商业逻辑与UI的分离

我们在评估当时可用的GUI开发工具时发现好的IDE都是手写Swing代码这就不符合我们的第一个和最关键要求

我们定义的容易使用是指任一开发者不管他/她的Java Swing经验都具有在几分钟而不是几小时内开发一个可运行的GUI表单因此就要是开发者的精力集中在商业逻辑上而不是框架的细节一开始我们的开发者就需要所见即所得的环境以便能够真实地感知当应用程序发布的时候的情况这一功能的实现节省了开发者的大量时间但当时我们评估的工具没有一个能够实现这个功能设计的屏幕与输出的屏幕并不一样还有糟糕的调度算法对我们来说简直就是巨大的倒退AbaGUIBuilder通过预览模式来实现这一功能你可以在开发时看到它运行起来的样子

为什么Abacus Research要求UI和商业逻辑的分离?因为企业要处理不断变换的政府规则例如税收和工资计算我们需要在一个独立的包装模块里维护规则和公式时保持UI不变的能力使得当公式改变时应用程序JAR(UI)并不需要变化因此只有改变的公式需要测试使得发布的进程简单化

为了满足这个需求我们设计的GUI编译器将应用程序和事件汇编到一个应用程序JARJAR隐藏了所有的GUI Swing 代码并且通过一个renderer类(AdaRenderer)在运行时来执行应用程序

不需要Swing经验

为了确保开发工具能够做到真正的所见即所得我们决定采用类似Delphi和VB中用XY坐标来定位的布局管理方式采用这种方式Swing JFrame就是一个画布开发者可以将Swing组件放入JFrame的XY布局中有了XY布局管理器我们的开发者不需要理解Swing中并不熟悉的复杂的布局管理器这样我们的应用程序开发者就可以把精力集中到应用程序UI和它的商业逻辑中

事实上AbaGUIBuilder包含了大部分的Swing可视组件从面板到制表符页还有对菜单﹑菜单项带有Java数据库连接的数据库感知组件JFreeChart组件的支持和导入第三方可视类库的能力所有这些组件都可以从组件选择区拖入一个空框架来开发你的GUI应用程序

示例项目: 跟蹤开发商的联络信息

最佳的展示AbaGUIBuilder RAD(快速应用程序开发)的方式就是开发一个带有菜单栏的多文本制表符面板的示例程序首先你必须通过在组件选择区选择JFrame将其拖入应用程序画布中来实现将JFrame对象放入空的表单面板中然后将所有的可视组件托在JFrame上注意当你开始一个新的项目时必须先放入JFrame使其成为你的对象画布见图

应用程序JFrame 作为画布 点击缩略图查看完整图

其次增加一个制表符格和两个制表符页在组件选择区的容器区内选择JTabbedPane将其拖入JFrame当JTabbedPane放置好后右键在弹出菜单中选择 Add JATabPage在面板上增加两个制表符页如图

增机制表符页: 右键制表符页选择Add JATabPage

然后在属性栏中选择TabTitle为每个制表符页设置标题

可以放入Swing组件的空制表符页

这时你已经有了两个空的制表符页你可以从组件选择区选择任意的Swing组件放入其中在我们的例子中开发者制表符页中包含两个屏面上面有一系列的JLabel和JTextField对象你能够很快的开发出一个类似图的应用程序作为一个可视化应用程序开发者你能够体会到使用Abacus GUI编译器能给你开发复杂的GUI应用程序所带来的方便

短时开发的应用程序

编译器带的透视图模式是一个很有用的特征因为它能够预览运行时的应用程序通过选择工具栏的Run选项或者按F即可进入透视图模式

所见即所得: 开发时检查视觉效果

这时保存你的工作按下CtrlS或者选择Save选项给项目起名叫devteam将其保存到示例目录中在你保存完项目后打开AbaGUIBuilder的示例目录打开文件devteamprojproj文件是一个XML文件其中定义了应用程序中的所有类对象对象的性质甚至是代码这是一个对你的可视项目的表达平台

增加事件句柄

为每个对象增加事件句柄是一个直截了当的过程你所要做的就是点击对象从事件列表中选择你希望中断产生的事件并为事件填写合适的Java代码再一次证明AbaGUIBuilder的设计符合Delphi和VB的模式我们的目标是对应用程序开发者隐藏UI的实现例如事件监听器等举个例子如图为了实现按下Exit(退出)按钮时弹出一个确认对话框首先选择Exit按钮的actionPerformed事件然后填入如下Java代码

为可视化组件增加事件句柄

切记事件句柄在IDE透视图模式下并不能使用只有在运行时才被激活所以你必须编译运行应用程序才能检查结果

可视化地增加一个菜单和菜单项是另一个强大的并节省时间的特征你所要做的就是从组件选择区选择JMenuBar并将其放在框架的任意地方JMenuBar一般放在顶部且XY坐标无关然后右键点击JMenuBar弹出一个弹出框如图为菜单增加JMenuJMenuItem(s)和事件句柄

可视化增加菜单和菜单项

然后复制Exit按钮的actionPerformed事件代码到Exit菜单项中使得不管选择Exit按钮还是Exit菜单项都回弹出一样的确认对话框最后点击工具栏中的Save(WithCompile)现在你完成了你的第一个AbaGUIBuilder应用程序

代码到哪里去了?

我们经常听到这样的问题代码去哪了?AbaGUIBuilder并不是不创造Java代码只不过是编译器内部生成的Java代码不被看到和用到而已GUI编译器通过运行独立的包装程序(renderer)将内部代码编译到应用程序的jar文件中事实上你可以在\bin\output目录下检测AbaGUIBuilder产生的Java代码但是切记这些代码并使被外部使用的它只不过作为一个辅助工具当编译器生成的代码万一有问题时使用

生成项目文件(proj)后GUI编译器生成两个文件你的应用程序jar文件和decl文件随后当你写包装器文件时decl文件会有帮助它包含了所有的对象定义和一个通用入口函数getReferences()并且它将UI表单的所有可视元素写为私有变量我们可以使用decl文件程序段中的这些私有变量实现商业逻辑和UI的分离

开发过程中我们推荐你使用例子文件夹中的runproz脚本来运行你的应用程序jar文件这个脚本文件设置了classpath填交了所有需要的JAR使用示例Java包装器来运行应用程序JAR如图当你运行devteam应用程序时命令如下runproz \abaguibuilder\samples\devteamjar

部署应用程序

理解runproz的机制很重要虽然很简单让我们注意下行%JAVA_HOME%\bin\javaexe exec %

exec是示例包装器AbaRenderer提供的默认加载机制参数%指的是AbaGUIBuilder应用程序JAR的名字当JAR的路径和名字传给execjava时它将加载和运行指定的应用程序JAR这就是应用程序JAR运行的机制

编写自己的包装器

AbaRenderer包装器是一个用AbaRenderer 对象来加载应用程序jar的Java程序包装器是一个仅仅需要几行代码的简单程序

public classexec

{

public static AbaRendererm_AbaRenderer ;

// Assignments for this user interface

public static void main(String[] args)

{

String docname = new String(args[]);

try

{

Systemoutprintln(Loading + docname);

m_AbaRenderer = new AbaRenderer(docname true null);

boolean bTestLoad = m_AbaRendererload();

if(bTestLoad)

m_AbaRendererrenderInterface(); }

catch(Exception e)

{eprintStackTrace();}

}

}

当部署应用程序时你可以选择使用runproz和示例包装器来发布它也可以使用你自己写的包装器和classpath当你需要为你的包装器增加其它的一些特征时我们推荐你编写自己的包装器例如使用第三方程序库的监听器手工初始化对象为组合框增加代码或者最后将UI从业务逻辑中分离出来等

将业务逻辑从UI中分离出来

为了将应用程序的UI和业务逻辑分离开你必须写自己的包装器一个分离的简单例子就是在开发工具和项目以外通过包装器手工地初始化应用程序的可视组件当你再次调用时GUI编译器生成一个声明文件这个文件有一个访问方法可以初始化一系列私有变量这些私有变量是表单上可视对象的引用getReferences()方法允许开发者访问和操作表单上的任一可视组件

下面的exec程序在第一个制表符位置初始化了一个组合框示范了一个简单的应用程序UI和业务逻辑的分离

public classexec

{

public static AbaRendererm_AbaRenderer ;

// Declarations of variables for this user interface

……

private JComboBox JStComboBox;

// Assignments for this user interface

public void getReferences()

{

//Loads the visual object JComboBox to private data JComboBox

JStComboBox= (JComboBox)m_AbaRenderergetObject(JComboBox);

}

// Assignments for this user interface

public static void main(String[] args)

{

String docname = new String(args[]);

try

{

Systemoutprintln(Loading + docname);

m_AbaRenderer = new AbaRenderer(docname true null);

boolean bTestLoad = m_AbaRendererload();

if(bTestLoad)

{

m_AbaRendererrenderInterface();

getReferences();

// Sample access to objects

JStComboBoxaddItem(FL);

JStComboBoxaddItem(CA);

JStComboBoxaddItem(WA);

JStComboBoxaddItem(MD);

JStComboBoxaddItem(PA);

}

}

catch(Exception e)

{

eprintStackTrace();

}

}

}

上面例子演示了一个简单清晰的UI和业务逻辑的分离明显的优势就是你可以轻松地改变初始化例程而不需要改变应用程序UI你将发现当你的应用程序变得越来越大越来越复杂时这一特征越来越重要——对于所有的开发项目而言这将是一个值得效仿的做法

结论

AbaGUIBuilder最初是为了满足我们的Delphi应用程序开发者的需要而设计的节省了很多开发时间而且是我们的GUI开发转换变得容易对于其他的大多数Delphi和VB的开发者而言它也能做得很好

资源

·下载本文源代码: /abacus/jwabacuszip

·下载AbaGUIBuilder:

·Screen shots和其他文章:

·Abacus 研究:

·更多关于GUI开发的文章请浏览JavaWorld文章列表的用户界面设计部分: _content/jwuiindexshtml

·GUI编程论坛:?forumId=

上一篇:多形对象的互换使用

下一篇:JBuilder2005单元测试之创建测试固件