图形程序设计入门
学习目标
描述java图形程序设计类的层次结构
使用框架、面板和简单用户界面GUI组件
布局管理器
在面板上绘制组件
–paintComponent方法
¨
¨ 熟悉Colors, Fonts, and Font Metrics类
¨ 绘制几何图形
¨ 理解事件驱动程序设计的概念
–事件源,监听器和监听接口 Listener Interface
早期的Java图形界面设计采用AWT组件:
现代的程序中,图形化的使用者接口(GUI)相当重要,良好的GUI可以让程序更具吸引力、更好操作、更容易学习。虽然 Java 早就有 AWT,可以用来设计 GUI,但是 AWT 有两大缺失:
AWT 只提供最基本的组件(比方说:按钮、滚动条等),而不提供 TreeView 等现代化GUI组件。更糟的是,AWT 的组件还只提供最基本的功能,比方说:按钮上面只能出现文字,不能出现图形。(当然,你也可以利用继承的方式来设计出图文兼容的按钮,但这还要花不少额外的时间。)
不能跨平台:AWT透过「同位体系统(peer system)」来和操作系统沟通。比方说:如果你建立一个按钮(Button)对象,就会有一个按钮同位体(ButtonPeer)对象被建立,此按钮同位体对象会请底层的操作系统建立一个真正的按钮。如果此程序是在 Windows 98上执行,所建立的按钮自然是 Windows 98 的按钮。AWT组件的外观就会受到底层操作系统的影响。
目前更流行的是Swing组件:
Swing 是由 Sun 公司研发设计。有了 Swing,上述的问题都迎刃而解。Swing 不但填补了 Java GUI 不能跨平台的缺点,也提供许多新的组件,可以用来组合出复杂的用户界面,除此之外,Swing 也为 Java 注入新的特色,支持包括了拖放功能(drag-and-drop)、复原(undo)、并允许使用者改变 GUI 的外观(look and feel)。Swing 组件都是「轻量级的(lightweight)」。
Swing是一个带有丰富组件的GUI工具包,它组成了JFC(Java Foundation Class)的用户界面功能的核心部分,它不仅是AWT所提供的组件的替代品,并且在这些组件的基础上有了很大进步。Swing 都是100% 纯Java的,不依赖具体的Windows系统,可以在各种平台上实现。Swing包含了250多个类,提供了40多个组件,是AWT组件的四倍,Swing还提供了大量有助于开发GUI界面所需的附加组件,它们都定义在javax.swing扩展包中。为了和原来的java.awt包区别开来,SUN专门为Swing设置了扩展包(javax.swing),并规定所有的Swing组件都是以字母“J”开头,如JLable、JButton、JTextField等,以示和AWT组件进行区别。
Swing组件不能取代AWT组件,因为Swing 是架构在 AWT 之上的,没有 AWT 就没有Swing。它只能替代AWT的用户界面组件,辅助类仍保持不变,并且仍然使用AWT的事件模型。
图形程序设计所用类层次结构 (Swing)
¨
图形类可以分为三组:容器类、组件类和辅助类。
¨ 容器类:如Jframe、Jpanel和Japplet等,用来包含其他组件。
容器是图形用户界面中容纳其他组件的部分,一个容器中可以容纳一个或多个组件,甚至还可以容纳其他容器。
¨ 组件类:如JButton、JTextField、JTextArea、JComboBox、JList、JRadioButton、JMenu等,都是JComponent类的子类。
组件通常为图形用户界面中的可见部分,例如按钮和标签等。通过add()方法可以将组件加入容器并显示出来。
¨ 辅助类:如Color、Font、FontMetrics、Dimension和LayoutManager等,是组件和容器用于绘制和放置对象的。
框架
¨ 框架是一个不被其它窗体所包含的独立的窗体,是在java的图形化应用中容纳其它用户接口组件的基本单位。
¨ Frame类是用来创建一个窗体的。
UI (用户接口组件)
¨ 要创建一个用户界面,需要创建一个框架或applet来存放用户界面组件。
¨ 框架或applet可以包含菜单、面板和用户界面组件。面板用于分组存放用户界面组件,还可以存放其他面板。
创建框架
¨ 下面两个构造方法用来创建Jframe对象:
l publicJFrame()
声明并创建一个没有标题的Jframe对象。
l publicJFrame(String title)
声明并创建一个指定标题的Jframe对象。
¨ 源程序:MyFrame.java
¨ 注意:为使之在JDK1.2中运行,需注释掉 EXIT_ON_CLOSE 相关的语句。
框架居中
¨ 默认情况下,窗体将显示在显示器的左上角为了让框架显示在指定位置,须用JFrame类中的setLocation(x,y) 方法。
¨ 要把框架放在屏幕上居中的位置,需要知道屏幕和框架的宽和高。
¨ 屏幕的宽和高可由java.awt.Toolkit类得到:
Dimension screenSize =Toolkit.getDefaultToolkit().getScreenSize();
int screenWidth = screenSize.width;
int ScreenHeight =screenSize.height;
¨ 框架的宽和高可由Component类中的getSize方法得到:
Dimension frameSize =frame.getSize();
int frameWidth = frameSize.width;
int frameHeight = frameSize.height;
在框架中添加组件
¨ 使用add方法可以在框架的内容窗格中添加组件:
//在框架中添加一个Button组件
frame.getContentPane().add(newJButton("OK"));
¨ 源程序:MyFrameWithComponents.java
布局管理器
¨ Java的布局管理器提供了一层抽象,自动把用户界面映射到所有的窗口系统。
¨ Java的GUI组件放在容器中放置。这些GUI组件由容器的布局管理器来安排位置。
前面的程序中并没有指定”OK”按钮在框架中的放置位置,但Java知道该把按钮放在哪里,因为在后台工作的布局管理器能够将组件放到正确的位置。默认情况下,Jframe的内容窗格默认的布局管理器是BorderLayout。
¨ 布局管理器设置在容器中,设置的语法如下:
container.setLayout(newSpecificLayou());
设置好布局管理器后,就可以向容器内添加组件。要将组件添加到容器,使用add方法。要从容器中删除一个组件,使用remove方法。
容器container可以是框架或applet的内容窗格,或是JPanel的一个实例。
布局管理器的种类
¨ FlowLayout
¨ GridLayout
¨ BorderLayout
¨ CardLayout
¨
¨ GridBagLayout
布局管理器FlowLayout
¨ FlowLayout是最简单的布局管理器。它按添加组件的顺序由左到右将组件排列在容器中,一行排满后再排新的一行。
¨ FlowLayout的三个构造方法:
• public FlowLayout(int align,int hGap,intvGap)
根据指定的对齐方式、水平间距和垂直间距构造一个新的FlowLayout对象。间距指组件之间用像素度量的距离。
对齐方式可以使用三个常量之一来指定,这三个常量是:FlowLayout.RIGHT、FlowLayout.CENTER、FlowLayout.LEFT。
• public FlowLayout(int align)
根据指定的对齐方式构造一个新的FlowLayout对象,默认水平、垂直间距都是5个像素。
• public FlowLayout()
构造一个新的FlowLayout对象,默认的对齐方式是居中,默认水平、垂直间距都是5个像素。
¨ 例 8.1:测试FlowLayout 布局管理器
按添加的顺序从左到右将组件排列在容器中。一行排满后,再排新的一行。
源程序:ShowFlowLayout.java
布局管理器GridLayout
¨ FGridLayout根据构造方法定义的行数和列数以网格(矩阵)的形式排列组件,组件按添加的顺序从左到右排列。
¨ FGridLayout的三个构造方法:
•public GridLayout(int rows,int columns, int hGap, int vGap)
该方法以指定的行数和列数构造一个新的GridLayout对象,组件在容器上的水平和垂直间距也按指定值设置。
•public GridLayout(int rows,int columns)
该方法以指定的行数和列数构造一个新的GridLayout对象,组件的水平和垂直间距设为0。
•public GridLayout()
该方法以每行一列的方式构造一个新的GridLayout对象。
¨ 例8.2:测试GridLayout布局管理器
布局管理器GridLayout根据构造方法定义的行数和列数以网格(矩阵)的形式排列组件。首先是第一行,接着是第二行,如此下去。
源程序:ShowGridLayout.java
布局管理器BorderLayout
¨ BorderLayout布局管理器将窗口分成五部分:东区、南区、西区、北区、中央。使用add(component,index)方法将组件添加到BorderLayout布局管理器中。
¨ add(Component,index)方法中, index是一个常量,取值为:BorderLayout.East, BorderLayout.South,BorderLayout.West, BorderLayout.North或BorderLayout.Center。
¨ BorderLayout的两个构造方法:
• public BorderLayout(int hGap,int vGap)
该方法根据指定的水平和垂直间距来构造新的BorderLayout布局管理器。
• public BorderLayout()
该方法构造新的BorderLayout布局管理器,组件之间没有水平和垂直间距。
¨ 组件根据它们最合适的尺寸和在容器中的位置来放置。南、北组件可以水平扩展,东、西组件能够竖直拉伸,中央组件既可以水平也可以竖直扩展以填满空白空间。
¨ Example8.3测试 BorderLayout布局管理器
本例使用BorderLayout布局管理器在框架中放置东、西、南、北和中央按钮。