Version 3.0
图形编程第八章
2
回顾
Java最新的事件处理方法是基于授权事件模型。
事件是描述事件源状态变化的对象。用户与 GUI组件交互就会生成事件。
事件源是一个生成事件的对象。当这个对象的内部状态改变时,事件就会发生。
在发生事件时,事件源将调用监听器定义的相应方法。
3
目标
解释图形的绘制
描述 Graphics 对象
了解 Font 类
了解 FontMetrics 类
了解 Color 类
掌握绘制各种图形的方法
4
所有的图形被画到相关联的窗口中。
完全可以直接在框架( Frame) 中绘入文本信息,甚至可以直接在框架中绘图。
框架经常被设计为一个组件容器。一般首先在一个面板中进行绘制,然后再将这个面板添加到框架 。
在框架中显示信息
5
paintComponent 方法
JPanel 非常适合于绘制自定义图形
其图形对象是作为 paintComponent() 方法的参数获得的。
要创建自定义图形,需要编写扩展 JPanel
类的新类。并覆盖父类的 paintComponent()
方法:
public void paintComponent(Graphics g){
.,,// 将在这里通过参数 g完成绘制代码
}
6
Graphics对象
paintComponent方法包含一个 Graphics类型的参数。
Graphics对象记录针对绘制图形和文本的一系列设置,比如设置的图标或当前颜色、
字体等。
Java中,所有绘制都必须通过一个图形对象。
7
Graphics对象的局限性
可以用 Graphics对象绘制的图形是原始图形。
对于这些图形,不能使用实数坐标
不能绘制虚线或宽度不定的线条
不能使用纹理或渐变颜色填充形体
8
Graphics2D对象
Java2D 包括一个 Graphics2D 类,此类扩展了 Graphics 类,所有图形方法都可以配合
Graphics2D 对象使用
Java 2D 图形的重要功能:
– 颜色和图案:图形可以用渐变颜色和填充图案着色。
– 透明绘制:图形的不透明度通过 α 透明值控制。
– 本地字体:平台上的所有本地字体都可用于绘制文本。
– 画笔的显式控制:可以使用线条的粗细、虚线图案以及段连接样式。
– 坐标系的转换:可以使用平移、缩放、旋转和剪切为了解决图形对象的局限性,在 Java1.1以后的版本中引入了 Java 2D。
9
基本的绘图方法
public void paint(Graphics g) {
g.setColor(someColor); //设置颜色
g.setFont(someLimitedFont); //设置字体
g.drawString(...);//绘制字符串
g.drawLine(...); //画线
g.drawRect(...); // 绘制图形轮廓
g.fillRect(...); // 绘制填充图形
g.drawPolygon(...);//绘制图形轮廓
g.fillPolygon(...);//绘制图形轮廓
..,
}
每个 AWT 组件定义一种传递 Graphics 对象的 paint
方法,绘制便是在该对象上执行。
设置画笔参数
10
Java 2D 中的基本绘图方法
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;//强制转换为 Graphics2D
g2d.setPaint(fillColorOrPattern);
g2d.setStroke(penThicknessOrPattern);
g2d.setComposite(someAlphaComposite);
g2d.setFont(anyFont);
g2d.setColor(anyColor);
g2d.translate(...);
g2d.rotate(...);
g2d.scale(...);
g2d.shear(...);
g2d.setTransform(someAffineTransform);
SomeShape s = new SomeShape(...);
g2d.draw(s); // 绘制图形轮廓
g2d.fill(s); // 绘制填充图形
}
设置画笔参数
11
Font 类
Font 类只有一个构造函数,
public Font(String name,int style,
int pointsize)
– 参数 name表示字体的名称。
– 参数 style表示样式可以是 Font.PLAIN、
Font.BOLD 或 Font.ITALIC
– 参数 pointsize表示字体的点数,即以磅为单位的字体大小,可以是 11,12,14,16 等 。
public void paint(Graphics g){
.,,
g.setFont(new Font("Helvetica",Font.ITALIC,18));
g.drawString("Draw where ever you want",100,10);
.,,
}
12
通过使用 getFontMetrics( ) 方法,而不是 new
运算符(因为它是一个抽象类),可以创建该类的对象。
这个对象包含与字体相关的大量信息,包括字符的高度、按像素数计算的字符串宽度等。
常用方法如下:
int stringWidth(String s):返回 字符串宽度
int charWidth(char c):返回字符 c的宽度
int getHeight():返回字体的高度
FontMetrics 类 有时,需要测量用特殊字体显示的一个字符串,
可以使用 FontMetrics类
13
使用字体示例 1
import java.awt.*;
import javax.swing.*;
class FontsPanel extends JPanel {
public void paintComponent(Graphics g) {
String quote=" Happiness is an attitude.";
Font f=new Font("Georgia",Font.ITALIC,16);
g.setFont(f);
g.drawString(quote,20,20);
}
}
该包中包含 JPanel和
JFrame组件创建一种新字体,并将该字体设置为当前字体
public class FontsDemo extends JFrame{
public FontsDemo() {
setTitle("test"); setSize(300,200);
Container contentPane=getContentPane();
contentPane.add(new FontsPanel());
}
public static void main(String args[]) {
FontsDemo frame=new FontsDemo();
frame.show();
}
}
14
使用字体示例 2
import java.awt.*;
import javax.swing.*;
class Fonts2Panel extends JPanel {
public void paintComponent(Graphics g) {
String myquote="Happiness is an attitude.";
Font f=new Font("Times New
Roman",Font.BOLD+Font.ITALIC,24);
g.setFont(f);
FontMetrics fm=getFontMetrics(f);
int x=(getSize().width - fm.stringWidth(myquote))/2;
int y=getSize().height/2;
g.drawString(myquote,x,y);
}
}
创建一种新字体,并设为当 前字体求字符串宽 度
15
列出当前平台上所有可用字体
import java.awt.*;
public class ListFonts {
public static void main(String[] args) {
GraphicsEnvironment env =
GraphicsEnvironment.getLocalGraphicsEnvironment();
String[] fontNames =
env.getAvailableFontFamilyNames();
System.out.println("可用字体,");
for(int i=0; i<fontNames.length; i++)
System.out.println(" " + fontNames[i]);
}
}
16
颜色
java.awt.Color 类提供了 13个可用作标准颜色的常量:
black( 黑色) green( 绿色)
red( 红色) blue( 蓝色)
lightGray( 浅灰色) white( 白色)
cyan( 蓝绿色) magenta( 洋红色)
yellow( 黄色) darkGray( 深灰色)
orange( 橙色) gray( 灰色)
pink( 粉红色)
17
Color类的构造函数
Color类的构造函数如下:
- Color(int red,int green,int blue):
使用三个分别代表红,绿,蓝的整数来表示它们混合的颜色 。 这些值必须在 0到 255之间 。
- Color(float red,float green,float
blue),用三个浮点数指定红,绿,蓝的相对混合 。
Color a= new Color(0.907F,2F,0F);
Color b= new Color(255,255,0);
18
如果要修改或设置组件的颜色,可以使用下列几种方法:
void setColor(Color newColor),设置当前绘制的颜色
void setForeground(Color),设置前景色
void setBackground(Color),设置背景色设置颜色方法
19
使用颜色示例
import java.awt.*;
import javax.swing.*;
class ColorsPanel extends JPanel {
public void paintComponent(Graphics g) {
Font f=new Font("Georgia",Font.ITALIC,16);
g.setFont(f);
g.setColor(Color.red);
g.drawString("Hello",75,100);
g.setColor(new Color(0,128,128));
g.drawString("World",75,125);
}
}
20
绘制图形 2-1
使用 AWT 时,通常通过调用 Graphics 对象的 drawXxx 或 fillXxx 方法来绘制图形。
通过 drawXxx方法绘制 图形边框,通过 fillXxx
方法绘制 填充图形。
这些对象用当前选择的颜色来绘制和填充,
黑色是默认的颜色。
21
绘制图形 2-2
在 Java 2D 中,通常先创建 Shape 对象,然后调用 Graphics2D 对象的 draw 或 fill 方法。
Java 2D 库以面向对象的方式组合几何形体。
java.awt.geom包中囊括了一些有用的 Shape
实现。如,
–Line2D
–Rectangle2D
–Ellipse2D
22
使用线条绘制图形
java.awt.Graphics中提供了一些方法用来绘制图形对象中的直线和多边形。方法如下:
void drawLine(int startX,int startY,int entX,int endY),绘制一条直线
void drawPolygon(int x[],int y[],int numpoints),绘制多边形轮廓
void fillPolygon(int x[],int y[],int numpoints):绘制填充多边形
void drawPolyline (int x[],int y[],int numpoints):绘制顺序连线,如果第一个点和最后一个点不同,该图形不封闭
23
绘制矩形和椭圆
void drawRect(int top,int left,int width,int height):
绘制矩形边框
void fillRect(int top,int left,int width,int height),
绘制填充矩形
void drawOval(int top,int left,int width,int height):
绘制椭圆边框
void fillOval(int top,int left,int width,int height),
绘制填充椭圆
24
绘图示例
class ShapesPanel extends JPanel{
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawLine(0,0,100,100);//画线
g.drawRect(10,10,60,30); //绘制矩形
g.drawRoundRect(90,80,80,80,20,20);//绘制圆角矩形
int xpoints[]={20,50,60,30,10};
int ypoints[]={50,50,70,90,70};
g.drawPolygon(xpoints,ypoints,5);//绘制多边形
g.setColor(Color.red);//设置颜色
g.fillRect(90,10,80,30);//绘制填充矩形
g.fillRoundRect(180,50,100,80,15,15);//绘制填充圆角矩形
g.fillOval(10,100,80,30); //绘制填充椭圆
}
}
25
绘图模式
XOR 模式的优点是,无论用什么颜色绘制对象,始终能够保证新对象是可见的。
语法如下所示:
void setXORMode(Color xorColor)
其中,xorColor 指定了绘制对象时与窗口进行异或操作的颜色。
要返回至覆盖模式,请调用 setPaintMode():
void setPaintMode()
绘图模式决定了对象是如何被画在窗口中的 。 默认情况下,对一个窗口的新的输出将覆盖该窗口中的任何已经存在的内容 。
26
import java.awt.*;
import javax.swing.*;
class XORPanel extends JPanel {
public void paintComponent(Graphics g){
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(10,10,80,30);
g.setColor(Color.green);
g.fillRect(50,20,80,30);
g.setXORMode(Color.blue);//设置为 XOR绘图模式
g.fillOval(90,30,80,30);
}
}
设置绘图模式示例
27
Toolkit 对象
要获得 Toolkit 对象,可以使用 Toolkit 类的静态 getDefaultToolkit 方法。
Toolkit getDefaultToolkit(),返回缺省工具包 。
Image getImage(String filename),返回一个将从文件中读取其像素数据的图像。参数 filename 包含图像文件(例如,GIF 或 JPEG 文件)
boolean drawImage(Image img,int x,int y,
ImageObserver ob),绘制比例图像。
28
显示图像文件的实例
以下提供了从当前目录获取本地图像文件的代码(如果图像文件不在当前目录中,必须提供完整的路径名):
String name="xyz.gif";
Image img=Toolkit.getDefaultToolkit().getImage(name);
要从网络中获得图像文件,必须提供 URL,
例如:
URL u=new URL(http://www.xyz.com/image.gif);
Image img= Toolkit.getDefaultToolkit().getImage(u) ;
29
总结 2-1
Graphics 类用于在屏幕上绘制诸如文本、
线条、矩形和椭圆的对象。
Font 类用于使 Java 程序输出结果中的文本显得更生动。
FontMetrics 类用于获得关于字体的信息。
30
总结 2-2
Color 类用于向应用程序或小应用程序组件添加颜色。
绘图模式决定了对象如何被画在窗口中。
可以 使用 Toolkit 对象将图形文件读入应用程序。