第七章 图形编程经过前面的学习,我们已经基本上掌握了 Java 程序设计,
接下来要学习如何创建和管理窗口、管理字体、输出文本和使用图形等内容。
本章要点:
Swing与 AWT的关系及图形程序设计的层次结构
掌握框架、面板和的使用
理解 Color,Font和 FontMetrics类
掌握在 Graphics类中绘制图形和显示字符
掌握图形的加载和显示
Swing是 Sun Microsystems建立的下一代 GUI工具包 。 它允许使用 Java语言进行企业级开发,程序员可以使用
Swing建立包含许多功能强大的组件的大型 Java应用程序 。
此外,还可以很容易地扩充和修改这些组件以控制它们的 外 观 和 行 为 。 Swing 是 Java 产品 ( JFC,Java
Foundation classes) 的一部分,大多数 Swing组件是直接用 Java代码绘制的,更少依赖目标机器上的平台,更少使用本地 GUI资源 。 因此,Swing组件称为轻型组件 。
Java 2 SDK1.5版本中包括许多已更新的 Swing类和一些新的特性 。
7.1 Swing概述
Swing不是 AWT的替代,Swing实际上是建立在核心 AWT
库之上的 。 Swing的产生主要原因就是 AWT不能满足图形化用户界面发展的需要 。 此外,AWT基于同位体的体系结构也成为其致命的弱点 。 而 Swing不包含任何平台专用代码,不依赖 操作系统 的支持,其组件是用纯 Java实现的轻量级 ( light-weight) 组件,没有本地代码 。 这是它与 AWT组件的最大区别 。 由于 AWT组件通过与具体平台相关的对等类 ( Peer) 实现,因此 Swing比 AWT组件具有更强的实用性 。 Swing在不同的平台上表现一致,并且有能力提供本地窗口系统不支持的其它特性 。
7.1 Swing概述 — Swing与 AWT之间的关系
Swing特性绝大多数 Swing组件是轻型组件,只有少数几个顶层容器不是轻型的 。 它们使用简化的图形基本元素在屏幕上绘制自己,甚至允许部分图像是透明的 。 Swing类能够规定每个组件的外观风格,甚至可以在运行时重新设置自己应用程序的外观风格 。 此外,Swing组件的设计支持对组件行为进行随意修改,用户可根据自己的需要进行设计 。
7.1 Swing概述 — Swing与 AWT之间的关系
Swing组件和容器在 Javax.swing包中,定义了两种类型的组件:顶层容器
( JFrame,JApplet,Jdialog,JWindow)和轻量级组件
( JComponent),Swing组件都是 AWT的 Container类的直接子类和间接子类。图 7.1列出了其中的部分继承关系图。
组件是一个可以以图形化的方式显示在屏幕上并能与用户进行交互的对象,组件不能独立地显示出来,必须将组件放在一定的容器中才可以显示出来。容器 (Container)也是一个类,
实际上是 Component的子类。因此,容器本身也是一个组件,
具有组件的所有性质,但是它的主要功能是容纳其它组件和容器。
7.1 Swing概述 — Swing与 AWT之间的关系
7.1 Swing概述 — Swing与 AWT之间的关系
Component
Container
Object
JComponent
JButton JTextField JTeatArea
JTree JTablen JPaneln
Frame Dialog
JFrame JDialog
Panel
Applet
JApplet
Window
图 7.1Java图形程序设计所用类的层次结构图
Java应用程序要创建一个用户界面,最常用的 Swing容器是
JFrame类。 JFrame类提供了一个包含标题、边框等的顶层窗口,尽管 JFrame框架是一个容器,但不能直接用 add()把组件添加到窗口中,而必须用 getContentPane().add()得到内容窗格。
7.2 框架
JFrame类的构造方法如下,
7.2 框架
1.JFrame() 创建一个无标题的框架
2.JFrame(String title) 创建一个标题为 title的框架
JFrame类的常用成员方法如下:
7.2 框架
1.public void setVisible(Boolean b)
设置框架是否可见,框架默认不可见
2.public void setSize(int width,int height)
设置框架的大小,框架默认位置是( 0,0)
3.public void setBounds(int x,int y,int width,int)
设置框架出现在屏幕上的初始位置( x,y),
框架在屏幕上的宽和高为( width,height)
4.public void setResizable(Boolean b)
设置框架是否可调整大小,框架默认不可调整大小
5.public void setLocation(x,y)
设置框架在屏幕左上角的放置位置为( x,y)处
JFrame类的常用成员方法如下:
7.2 框架
6.public void setDefaultCloseOperation (int Operation)
设置单击框架右上角关闭图标后,根据其中参数进行相应处理。
其中 Operation的有效值如下:
(1)DO_NOTHING_ON_CLOSE 什么也不做
(2)HIDE_ON_CLOSE工 隐藏当前框架
(3)DISPOSE_ON_CLOSE 隐藏当前框架,并释放框架所占的其他资源
(4)EXIT_ON_CLOSE 结束框架所在的应用程序
7.2 框架 — 创建并显示框架
import javax.swing.*;
public class Example7_1
{
public static void main(String[] args)
{
JFrame frame=new JFrame("Example7_1");
//创建以 Example7_1为标题的窗体
frame.setSize(400,400);
// 设置窗体的大小,窗口默认位置是( 0,0)
frame.setVisible(true);
// 设置窗体可见,如果不设置,窗体不可见
frame.setDefaultCloseOperation(frame,EXIT_ON_CLOSE);
//当框架关闭时结束程序。
//如果选择其他参数,框架关闭后,程序不会结束
}
}
7.2 框架 — 给框架定位在默认的情况下,框架在屏幕的左上角( 0,0),
如果要在指定的位置上显示框架,则需要使用
JFrame类中的 setLocation(x,y)方法进行定位,
( x,y)为框架在屏幕左上角的坐标位置。
7.2 框架 — 在框架中创建组件把组件添加到内容窗格中,不是直接到框架中,用
getContentPane().add()得到窗格内容面板是用来集合其他组件的 JPconponent的扩展。用面板容纳各种组件,可以随意地指定布局管理器,以达到实现要求的布局效果,实质上面板就是一个容器,在一个容器内可以嵌套另一个容器。 JPane的另一个重要用途是绘制文字和图形。
7.3 在面板中显示信息容器、面板和组件的关系如图所示,
7.3 在面板中显示信息容器面板组件面板组件
7.4 颜色
java的 java.awt.Color类为 GUI组件设置颜色。 /颜色中的
R(红 ),G(绿 ),B(蓝 )为三原色的比例。一个 RGB值由三部分组成:第一个 RGB部分定义红色的量;第二个 RGB部分定义绿色的量;第三个 RGB部分定义蓝色的量。 RGB值中某一部分的值越大,那种特定颜色的量就越大,这就是通常所说的
RGB模式。
7.4 颜色
Color类的构造方法为:
1.public Color(int r,int g,int b)
使用在 0~ 255范围内的整数指定红、绿和蓝三种颜色的比例来创建一种 Color对象 public Color(float r,float g,float b)使用在 0.0~ 1.0
范围内的浮点数指定红、绿和蓝三种颜色的比例来创建一种 Color对象
2.public Color(int rgb) 使用指定的组合 RGB值创建一种 Color对象
7.4 颜色
设置颜色用 java.awt.Graphics类的方法设定颜色或获取颜色。这些方法及其功能如下:
1.setColor(Color c) 设定前景颜色,c代表颜色。
2.setColor(new Color(int r,int g,int b)) 设定前景颜色的另一个方法。
3.setBackground(Color c) 设定背景颜色,c代表颜色。
4.getColor() 获取当前所使用的颜色。
7.4 颜色
Color类的使用用户可通过创建 Color对象指定组件的颜色值,也可以用 Java提供的一些常用的颜色 Color类数据成员常量取得颜色值或者是 Color类的成员方法取得颜色值。
如 g.setColor(Color.blue); //设置显示对象的颜色
7.5绘制几何图形
本节将介绍 Graphics类,Graphics 类是 java.awt 包中的一个类。其中包括了很多绘制图形和文字的方法,我们可以利用 Graphics 类创建的实例随意绘制图形和文字,让我们可以利用它们在组件上面取得许多的特效。
7.5绘制几何图形
Graphics 类可绘制的图形有直线、各种矩形、多边形、圆和椭圆等。下面列举 Graphics 类中一些绘制图形的方法:
1.绘制一个线段,从 (x1,y1)到 (x2,y2)
drawLine(x1,y1,x2,y2)
2.绘制空心椭圆,其中 x和 y表示外接矩形的左上角坐标值,w和 h表示半径,当 w和 h相等时,画出来的就是一个圆。
drawOval ( x,y,w,h )
3.绘制实心圆,这里的参数 x,y,w,h的意义和上一样。
fillOval ( x,y,w,h )
4.绘制一个矩形框
drawRect ( x,y,w,h )
5.绘制一个有填充颜色的矩形
fillRect ( x,y,w,h )
7.5绘制几何图形
6.绘制一个圆角矩形框
drawRoundRect ( x,y,w,h,aw,ah )
7.绘制一个有填充颜色的圆角矩形
fillRoundRect ( x,y,w,h )
8.绘制一个三维矩形,其中 raised是一个布尔值,表示矩形从表面凸起还是凹进。
draw3DRect ( x,y,w,h,raised );
9.绘制一个椭圆框,其中 angle1和 angle2 分别表示起始角和生成角。
drawArc ( x,y,w,h,angle1,angle2 );
10.绘制一个具有填充颜色的椭圆。
fillArc ( x,y,w,h,angle1,angle2 );
11.绘制一个多边形,其中 x,y 表示 x 坐标和 y 坐标的数组,n 表示点的个数。
drawPolygon ( x,y,n )
7.5绘制几何图形
写字
drawstring ( String str,int x,int y )在屏幕的指定位置显示一个字符串。其中 x和 y为字符串画上去之后所占区域的左上角坐标值。
java 中还有一个类 Font,使用它可以获得更加丰富多彩和逼真精确的字体效果。一个 Font 类的对象表示了一种字体显示效果,包括字体类型、
字型和字号。下面的语句用于创建一个 Font 类的对象:
Font MyFont = new Font(,Arial”,Font.BOLD,10);
MyFont 对应的是 10 磅 Arial 类型的黑体字,其中指定字型时需要用到
Font 类的三个常量,Font.PLAIN,Font.BOLD,Font.ITALIC。如果希望使用该
Font 对象,可以利用 Graphics 类的 setFont()方法,g.setFont(MyFont);程序里首先用一个 Font 类型的对象保存系统缺省定义的字体,然后再设置不同的字体并显示其不同效果,最后再把字体恢复成原来的缺省效果。
7.6 文本和字体
在屏幕上显示文本时,我们可以设置包括背景颜色、前景颜色和字体属性等,处理组件文本的字体和字体的高度、宽度的信息包含在 Font和 FontMetrics类中。
7.6 文本和字体 — Font类
Font类对象包含了对文档字体的完整定义。可以通过组件或图像对象的
getFomrMetrics()方法来获取 FontMetrics类对象。
Font类的构造方法如下:
public Font(String name,int style,int size)
参数说明:字体的名称 name可以取 ScanSerif,Monospace,Dialog、
Serif,DialogInput等之一,字型 style可以取 Font.BOLD,Font.ITALIC、
Font.PLAIN之一,字的大小 size为磅
Font类方法:
public static Font getFont(String mf);
public static Font getFont(String mf,Font font);
7.6 文本和字体 — Font类
成员方法:
public string getFamilyt();
public string getSize();
public string getStyle();
public boolean isBold();
public boolean isItalic();
public boolean isPlain()。
7.6 文本和字体 — Fontmetrics类
Fontmetrics可用来计算字符串的精确长度和宽度,它是一个抽象类,
它不能直接被实例化。但可以通过调用 Component或 Graphics对象的
getFomrMetrics()方法获取一个 Fontmetrics对象。 Fontmetrics使用下列属性来确定字符信息(如下图所示)。
高度 (height):为 descent,ascent,leading之和的距离;
下差 (descent):一个字符低于基线的部分;
上差 (ascent):一个字符高于基线的部分;
字冠 (leading):为 height减去 descent,ascent的距离。
7.6 文本和字体 — Fontmetrics类
7.6 文本和字体 — Fontmetrics类
Fontmetrics类方法如下:
public FontMetrics getFomrMetrics(Font font);
返回指定字体的尺度
public FontMetrics getFomrMetrics();
返回当前字体的尺度
7.6 文本和字体 — Fontmetrics类
Fontmetrics类的成员方法如下:
public int getAscent();
public int getDescent();
public font getFont();
public int getHeight();
public int getLeading();
public int getMaxAscent();
public int getMaxAdvance();
public int getMaxDescent();
public int stringWidth(String str);
7.7 图像 — 加载图像并显示图像
一个 Image图形图像,要从文件中获取图像,可以调用 Applet
或者 Toolkit类中的 getImage方法加载或使用 ImageIcon类来加载。 Java中处理图像要经过下列三个步骤:加载图像、生成
ImageIcon 对象、显示图像。
7.7 图像 — 加载图像并显示图像
加载图的方法如下:
public Image getImage(String filename) 通过本地加载
public Image getImage(URL url) 通过网络加载调用 Graphics.drawImage()方法可以初始化实际的加载。
生成 ImageIcon 对象如,ImageIcon(Image)
显示图像将 ImageIcon对象作为参数创建组件就可以在组件中显示图像。
7.7 图像 — 图标
Swing引入了图标,在各种组件中可以使用它们,使用 Icon接口和 ImageIcon 类处理简单图像。 Icon接口指定了三个用来设置图标的大小和显示的方法,图标不一定是位图或 GIF图像,
对于绘制自身的组件来说,图标可以是任意图像。
ImageIcon使用 java.awt.Image对象存储和显示任何图形,并提供了同步图像加载,这使得 ImageIcon变得非常强在并且易于使用。
7.7 图像 — 图标
ImageIcon类的构造方法:
ImageIcon( Image image)
ImageIcon (Image image,String annotate)
ImageIcon (String filename)
ImageIcon (String filename,String annotate)
ImageIcon (URL location)
ImageIcon (URL location,String annotate)