Java图形界面事件处理与MFC的对比

来源:互联网 发布:网络拓扑图设计软件 编辑:程序博客网 时间:2024/05/27 21:00

  • 写在前面
  • 类继承层次关系
    • Java GUI
    • Java事件处理
    • MFC
  • 事件处理方式
  • 原因分析
  • 总结
    • 参考资料

写在前面

本博文是我根据自己的学习经验以及一些参考书籍总结出来,不具有权威性,如有错误,欢迎各位批评指出,我的邮箱:chaoyanglius@outlook.com欢迎给转载,转载请遵守CCPL协议(见文末),本文链接:http://blog.csdn.net/github_30605157/article/details/51727757.

刚刚学了MFC,感觉好吃力,有些东西实在是有点儿复杂,令人很头疼。这时我才想起Java的好,于是又把Java书翻出来,把Java的事件处理机制好好复习了一遍。下面是我根据自己的理解,将二者做了一下简单的对比。

类继承层次关系

Java GUI

p3

Java事件处理

p1

p2

MFC

p2

在MFC中的GUI以及组件是通过资源文件来产生的,而Java中则仍然采用类的形式来产生相应的界面以及组件。

事件处理方式

下面是我对Java事件处理机制的概括:

Java采用事件委托模型,该模型由事件对象、事件源、事件监听器三部分组成。当一个事件从某个事件源发生时,事件源便将事件对象传递给所有注册的监听器,监听器对象将利用事件对象中的信息决定如何对事件做出响应。

事件源与监听器之间必须先建立委托关系,建立的方法是通过调用addXXXListener函数。

比如:

Button.addMouseListener(ActionListener);

这样就将事件源ButtonActionListener之间就建立了委托关系,也叫做注册;接下来就会根据事件对象中的信息调用相应的方法来处理事件。

下面我们再来看看MFC是如何处理事件(MFC习惯称之为消息,下面改使用消息)的:

在MFC消息处理机制,有一个最重要的部分——消息映射(Message Map),这也是我们所能明显看到的部分(内部的消息处理实际上和win32很相似,内部隐藏了WinMain函数,包括窗口类的注册和产生,而且在CWinApp类的run函数里面存在消息循环,包括获取消息的GetMessage函数和分派消息的DispatchMessage函数)。当一个消息产生时系统会根据具体的消息类型,在MFC的消息映射表中找到对应的函数处理。因此,我们所做的工作就是将消息与对应的处理函数绑定即可。

NOTE:当然我这里介绍的都是表面上的、显而易见的原理,既然是对比,就应该公平的比较,因为我在上面介绍的Java的事件处理的机制也是表面上的,并未深入说明,其实大多数资料对于Java的事件委托模型的讲解也都只是讲这些东西,具体怎么实现并未详细说明;另外我在本文中对于MFC的消息处理不在做深入的讲解,因为不论网络上还是书籍(比如侯杰的深入浅出MFC)上都有丰富而又精彩的讲解。

原因分析

  • 表面上看,Java的事件处理与MFC的事件处理都同样简洁,一目了然,但这些都是表面上的,它们内部的工作都十分复杂。而且关于Java事件委托模型内部的原理(如何实现的)的资料,不管是网络上还是书籍上都很难找到;而关于MFC消息处理机制的内部原理的资料却非常的丰富。原因显而易见,Java的事件委托模型不需要理解很深入,便可驾轻就熟,而MFC如果不理解的深入一些,便很难驾驭。因为在MFC中涉及到很多的类,每个类中都可能会有一个消息映射,在将消息ID与处理函数绑定之前我们需要知道应该在哪个类的消息映射中添加,也就是说我们必须对类的层次关系以及各个类的功能有所了解。

NOTE:貌似论文中有很多关于这方面的资料,我想我是不是可以不严谨地说:Java的事件委托模型的内部实现原理更难理解一些,以致于需要专门的学者去做研究呢。我曾今尝试过阅读它的源代码,但是感觉好像比MFC更难理解一些,只是模模糊糊地看懂了一些。

  • Java封装得非常好,整个程序的工程很简洁,以致于程序员感觉不到背后工作的复杂,而对于MFC,它的封装就不如Java了,程序员在编程时依然可以看到消息处理过程的踪影——消息映射表(一系列难以理解的宏,如DECLARE_MESSAGE_MAP(),BEGIN.../ON.../END...)而且庞大的工程文件也让程序员十分的头疼。在Java程序中,程序员看不到类里面的东西,实际也不需要看到,我们只需要了解类中的方法如何使用就行了以及有哪些接口需要实现就行了;而在MFC中,程序员必须面对各种类:CXXXFrame,CXXXApp,CXXXDoc,CXXXView等等,我们必须清楚每种类具体是干什么的,我们才能对类进行修改扩展,否则的话就无从下手,因为我们连main函数(程序的入口)都找不到(当然MFC是有main函数的,只是隐藏起来了)。总结起来一句话,MFC提供给程序员的是一个框架,而Java提供给程序员的则是一个工具。使用工具当然比使用一个框架容易得多。

总结

这么说来,貌似Java好像没有MFC自由(我的确是这么认为的)。但是要自由必须付出代价:大多数的Java学习者基本上都避开了事件委托模型实现的具体方法的学习,这也是Java入门门槛低的原因,也就是说我们不必了解这些原理性的东西,照样可以写出很好的程序;而MFC就不一样了,大部分的初学者基本都要从win32程序开发开始学起,理解了win32的消息处理之后,再去学习MFC的消息处理(如何实现),这当然需要很多的精力和时间。而且同样完成一个任务,MFC的代码量相对较多,实现起来也比较繁琐。

参考资料

  1. Java核心技术卷I. Cay S.Horstmann等著.机械工业出版社
  2. Java语言程序设计. Y.Daniel Liang著. 机械工业出版社
  3. 深入浅出MFC. 侯俊杰著. 华中科技大学出版社

知识共享许可协议
本作品采用知识共享署名-非商业性使用-相同方式共享 4.0 国际许可协议进行许可。

0 0
原创粉丝点击