界面设计器分析
界面设计器分析
最近需要开发一个基于 Eclipse 的 Python 界面设计器,为此我对现有的各类 GUI 设计工具进行了分析,发现 GUI 设计工具在实现架构上存在不同的技术流派。
在早期开发阶段,界面代码均需开发人员手工书写,这无疑增加了开发难度。Delphi、VB 等工具的出现扭转了这一局面:开发人员只需在控件面板上进行拖拽操作即可完成界面设计,实现了“所见即所得”(WYSIWYG)的开发方式。仔细分析,GUI 设计工具主要可分为以下三种架构模式:
1. 基于界面文件的纯代码生成
NetBeans 是这类工具的典型代表(JBuilder 似乎也采用类似实现)。在 NetBeans 中,与界面设计相关的文件主要有两个:
.java文件:通过解析.form文件生成的代码,主要的界面初始化代码位于initComponents方法中。该方法在 NetBeans IDE 中通常无法手工编辑。.form文件:以 XML 格式描述界面布局、控件属性等信息。
工作原理: 当用户拖拽控件时,NetBeans 将控件描述信息更新至 .form 文件,并即时生成新的代码到 .java 文件中。
优点:
- IDE 实现相对容易,开发人员只需关注界面信息到
.form文件的转化,以及.form文件到.java代码的解析生成,无需处理用户修改.java代码造成的反向解析问题。 .java文件可脱离.form文件存在,即.form文件仅在设计期有意义,运行期无用。
- IDE 实现相对容易,开发人员只需关注界面信息到
- 缺点: 用户无法手工修改生成的代码,灵活性受限。
2. 代码生成与界面文件结合
Delphi 和 VB 是这类工具的典型代表。以 Delphi 为例,新建界面后会存在两个文件:
.dfm文件:描述界面布局和控件属性等信息。.pas文件:定义控件变量和事件处理函数。
工作原理: 编译时,.dfm 文件被编译到可执行文件中;运行时,程序动态解析 .dfm 文件来构建界面。
- 特点: 与 NetBeans 不同,
.dfm文件具有运行期意义。若缺失.dfm文件,程序将无法编译运行。 - 局限性: 这种方式通常只适用于 Delphi、VB 等代码与 IDE 结合紧密的语言,生成的代码很难进行手工修改。
3. 无界面文件方式
Eclipse Visual Editor 是最经典的例子。
工作原理: 使用 Visual Editor 绘制 GUI 时,只存在一个 .java 文件。Visual Editor 将用户绘制的界面直接解析为 .java 代码。若用户修改了 .java 代码,Visual Editor 会启动一个虚拟机,在其中运行用户修改后的文件,获取运行时程序界面,并将其绘制回窗口设计器中。
优点:
- 所有界面信息集成到一个文件中。
- 支持用户手工修改生成的代码。
- 设计器中的界面是通过虚拟机运行得到的,保证了真正的“所见即所得”。
- 缺点: 需要重新启动一个虚拟机,导致速度较慢且资源占用较高。使用 Visual Editor 时,经常造成 Eclipse 内存不足而退出。
我的实现方案
在开发界面设计器的早期,我采用了基于界面文件的纯代码生成方式,系统中包含一个 .aui 文件和对应生成的 .py 源代码文件。后来由于系统需求变更(主要是要求允许开发人员修改生成的代码),我计划改用无界面文件方式。
然而,若完全采用 Visual Editor 的无界面文件方式,实现难度较大且资源占用过高。因此,我采用了另一种思路:在内存中为每个界面维护一个对象模型(树状结构)。
- 设计期: 用户绘制界面时修改内存中的对象模型;用户保存界面时,解析该对象模型生成
.py源代码。 - 加载期: 由
.py源代码加载绘制设计器界面时,首先通过解析.py源代码生成抽象语法树(AST),然后解析该 AST 生成界面的对象模型,从而绘制界面。
方案评估:
- 优势: 兼具 Visual Editor 的优点(支持手工修改代码),且资源占用较小。
- 风险: 由于手工修改代码的方式千差万别,若开发人员采用了较为生僻的语法,可能导致代码无法正确解析为对象模型,进而导致界面加载异常。
- 对策: 建议开发人员尽量采用常规代码结构来修改生成的界面代码。
补充说明
由于 HTML 代码本身就是一个树状模型,无需进行代码和模型间的转换,因此网页设计器不存在上述的技术流派划分。
说明: 文中提及的 Eclipse Visual Editor、JBuilder 等工具属于历史技术产物,部分已停止维护或不再主流。本文分析主要基于当时的技术架构背景,供设计参考。
版权声明:本文为原创文章,版权归 戴老师的博客 所有,转载请联系博主获得授权。
本文地址:https://1diff.fun/archives/jie-mian-she-ji-qi-fen-xi.html
如果对本文有什么问题或疑问都可以在评论区留言,我看到后会尽量解答。