图形用户接口( GUI )库最初的设计目的是让程序员构建一个通用的 GUI ,使其在所有的平台上都能够正常的显示。但是比较遗憾的是 AWT 产生的是在各系统看来都同样欠佳的图形用户接口, JAVA1.2 为老的 java1.0 AWT 添加了 java 基础类( JFC ),这是一个被称为 “Swing” 的 GUI 的一部分。 Swing 是第二代 GUI 开发工具集, AWT 采用了与特定平台相关的实现,而绝大部分 Swing 组件却不是。 Swing 是构筑在 AWT 上层的一组 GUI 组件的集合,为了保证可移植性,它完全用 Java 语言编写,与 AWT 相比, Swing 提供了更完整的组件,引入了许多新的特性和能力。 Swing 提供了更多的组件库,如: JTable , JTree , Jcombox 。 Swing 也增强了 AWT 中组件的功能。正是因为 Swing 具备了如此多的优势所以我们以后在开发中都使用 Swing 。 JComponent 类是 Swing 组件的基类,而 JComponent 继承自 Container 类,因此,所有的 Swing 组件都是 AWT 的容器。 Swing 采用了 MVC 设计模式。
设计模式: 当你解决一个问题时你不需要从头做起,取而代之的是,你应该参考过去的经验,或者向专家咨询意见,设计模式是一种方法,该方法以一种结构化的形式提供专家意见。设计模式的灵感来自于建筑学设计模式。设计模式已经成为文化的一部分,当你谈论 MVC 或 “ 观察者模式时 ” 全世界的程序员都明白你的意思,因而,模式已经成为讨论设计问题的有效方法。 Swing 采用了 mvc 模式, awt 事件模型采用了 “ 观察者 ” 模式。
MVC -【模型-视图-控制器】模式: 该模式同其他许多设计模式一样,都遵循面向对象的设计中的一个基本原则:不让对象具有太多的功能,如对于按钮来说不要让一个按钮类完成所有的事情,替代的方法就是让一个对象负责组件的观感,而另一个对象负责存储内容, mvc 模式实现三个独立的类:
模型-存储内容; 视图-显示内容; 控制器-处理用户输入
mvc 模式明确规定了三个对象如何进行交互。模型存储内容,它没有任何用户界面。对于一个按钮来说,内容非常简单,它只是一组标志,用来说明按钮是否按下,是否启用等。对于一个文本框来说内容稍稍复杂,它是容纳当前文本的一个字符串对象。这个内容和视图的内容并不一致--如果内容长度大于文本框的显示长度,那么用户只能看到的就是只有文本框显示的那一部分。
mvc 模式总结:模型存储完整内容,视图给出了内容的可视化表示【完整或者不完整】,控制器负责处理用户输入事件,如鼠标点击和键盘事件等,然后它决定是否把这些事件转化成对模型或视图的改变。控制器作用举例:如果用户在一个文本框中按下了一个字符键,那么控制器就会调用模型中的 “ 插入字符 ” 命令,然后模型告诉视图进行更新,而视图永远不会知道文本为什么改变了,但是如果用户按下了一个光标键,那么控制器会通知视图进行卷屏滚动。卷动视图对实际文本不会有任何的影响,因此模型永远不会知道该事件的发生。 Mvc 模式的一个优点是 : 一个模型可以有多个视图,其中每个视图可以显示完整内容的不同部分或不同方面。如果作为程序员来使用 Swing ,则不需要考虑 mvc 的体系结构,每个用户界面元素都有一个包装类(如 Jbutton 和 JTextField ),来保存模型和视图。
JFrame : JFrame 与 Frame 的功能相当,但远比 Frame 复杂。 JFrame 的结构相当复杂,在 JFrame 中安排了四个窗格,其中根窗格( JRoot )、布局窗格( JLayeredPane )和透明窗格( Glass pane )和我们没有什么关系;他们用来组织菜单条和内容窗格,以及实现观感的。 Swing 程序员最关心的是内容窗格( content pane ),当设计一个框架时,组件会被添加到内容窗格中,如下代码所示:
Container cp=f.getContentPane();
Component c=…
cp.add(c);
很明显上面的代码和我们在前面学的 AWT 的编程方式不一样,不能直接用 add 方法添加组件到 JFrame 上。 JFrame 的 ContentPane 的默认布局管理器为 BorderLayout 。
JPanel 组件为中间容器,用于将较小的轻量级组件组合在一起,这意味着它与内容窗格相似。 JPanel 默认为 FlowLayout 布局。
JMenuBar : 只能通过 JFrame 、 JWindow 或 JInternalFrame 的根窗格来添加。 JMenuBar 不能直接添加到窗体中。它由多个 Jmenu 组成,每个 JMenu 在 JMenuBar 中都表示为字符串。 JMenuBar 需要两个附件类来辅助其工作。它们是 SingleSelectionModel 类和 LookAndFeel 类。 SingleSelectionModel 类跟踪当前选定的菜单, LookAndFeel 类负责绘制菜单栏以及在其中发生的事件作出响应。
JMenu:有两个用途,显示在JMenuBar下时,它以文本字符串的形式显示;用户单击字符串时它以弹出式菜单形式显示。可包括标准菜单项,如JMenuItem、JCheckBoxMenuItem、JRadioButtonMenuItem和Jeeparator等。JMenu需要两个附件类来辅助其工作。它们是JPopupMenu类和LookAndFeel类。JMenu类将创建JPopupMenu类,并从当前可插入的观感中获得自己的观感,用户单击JMenu,LookAndFeel类负责绘制菜单栏中的菜单以及对在其中发生的所有事情作出响应。