Java_Graphics 功效:Graphics类是用于绘图和显示格式化文字的工具
API:http://docs.oracle.com/javase/7/docs/api/java/awt/Graphics.html
1.在Applet中写字和画画
要创建一个Applet,必须让自己的类从java.allpet.Applet类继承即可。Applet类是一个抽象类,它提供了五个抽象方法
init( ) applet初始化,在applet首次创建时执行。
start() applet开始正常运作。在每次applet画面在浏览器窗口中可见时调用,也在init()后调用。
stop( ) 停止运作。每当applet画面移出浏览器窗口的可见区域时调用,也是destroy( )前被调用。
paint() 在applet窗口中或画布上写字画图。也在update()方法中被自动调用。
destroy()废弃当前applet的实例。在applet从网页上重新装载时调用
例一:
import java.awt.*;
import java.applet.*;
public class Java_Graphics extends Applet {
public void paint(Graphics g) {
g.drawString("用Graphics写字和画图的基本方法", 20,40); //写字
g.drawOval(100, 100, 30, 30); //画椭圆
g.drawOval(200, 100, 40, 25);
g.drawLine(20, 140, 200,140); //画直线
g.drawRect(20, 160, 50, 80); //画ru
g.drawRoundRect(110, 160, 100, 100, 25, 18);
}
}
2.设置颜色以及字体
例1中的文字使用默认的字体和大小和默认的黑色,不免单调。使用不同的字体字号和选择不同的颜色是美化网页必不可少的;
设置背景色的是方法继承自Applet的,语法为:setBackground(new Color(int,int,int))即它的参数是一个Color对象句柄。
设置前景色的方法是属于Graphics的,即设置Graphics的绘图色。语法为:g.setColor(Color对象);
选择颜色有两种方法,一是直接用颜色值RGB创建Color对象,如:Color color = new Color(R,G,B)
另一种是用颜色常量如Color.red, Color.green等。Color类提供了13种颜色常量,由其格式可知它们都是静态的终极的。
设置字体需要使用java.awt.Font类创建一个Font对象。Font的常用构建器形如:
Font(字体名或逻辑字体名,字型,字号)
a:字体名是运行程序的操作系统适用的字体,
b:字型为Font类声明了的静态常量,有下列4种:
Font.PLAIN, Font.BOLD, Font.ITALIC, Font.BOLD|ITALIC
c:分别表示正常、粗体、斜体和粗斜体。下面的例程演示设置颜色和字体的方法。
例二:
import java.awt.*;
import java.applet.*;
public class FontDemo extends Applet {
public void paint (Graphics g){
String s1 = "This Font is ";
Font font = new Font("Arial", Font.BOLD, 18);
g.setColor(Color.red);
setBackground(new Color(0,255,0));
g.setFont(font);
g.drawString(s1 + font.getName() ,20, 60);
g.setFont(new Font("隶书", Font.BOLD, 28));
g.drawString("现在是隶书" ,20, 120);
g.setColor(new Color(0,0,0));
}
}
创建了字体对象font后,只要简单地用g.setFont(font)设置使用新字体。直到再次使用setFont前都有效。
在实际应用时最好先保存原有的颜色和字体设置,在使用完了后再恢复。
3.drawString()如何实现精确定位?
(1)需求:我们需要知道字符串显示的长度(象素)以控制水平方向的尺寸,知道字体的高度以控制垂直方向的尺寸
(2)解决方案:
Java另外提供了FontMetrics类来解决排版问题
用Graphics的getFontMetrics方法创建一个FontMetrics对象,它的getHeight()方法可得到字高,stringWidth(String)方法得到字符串占用的宽度。
FontMetrics fm = g.getFontMetrics(font); // 创建一个FontMetrics对象
int height = fm.getHeight();
int width = fm.stringWidth(s1);
例三:
import java.awt.*;
import java.applet.*;
public class FontMetricsDemo extends Applet {
public void paint (Graphics g){
String s1 = "Hello, Java World!";
g.setColor(Color.red); //前景色
setBackground(new Color(0,255,0)); //背景色
Font font = new Font("Arial", Font.BOLD, 18); //字体
g.setFont(font); //设置字体
FontMetrics fm = g.getFontMetrics(font); //类对象,可以获得某个字体的高度,以及字符串的宽度
int height = fm.getHeight();
int width = fm.stringWidth(s1);
int posx =50; int posy = 50;
g.drawString(s1 ,posx, posy); //posx,posy位置显示s1
g.drawString("I will come in." ,posx +width, posy+height);//偏移后的字符串显示
}
}
4.获得系统所支持的所有的字体名
Java有一个类叫GraphicsEnvironment提供绘图环境,它有一个方法叫getAvailableFontFamilyNames();
由它可以得到程序所在机器操作系统的所有字体名(是String不是Font)。
由于字体种类很多,一屏幕放不下,只在设定的Applat的界限内显示,除非给窗口添加垂直滚动条;
例四:
import java.awt.*;
import java.applet.*;
public class FontAll extends Applet{
public void paint(Graphics g) {
***GraphicsEnvironment gv =GraphicsEnvironment.getLocalGraphicsEnvironment();***
***String[] ftNames = gv.getAvailableFontFamilyNames();***
for (int i=0; i<ftNames.length; i++) {
Font ft = new Font(ftNames[i], Font.BOLD, 14);
g.setPaintMode();
g.setFont(ft);
g.drawString(ftNames[i], 5, 15 * (i+1));
g.drawString("Hello the world!", 200, 15 * (i+1));
}
}
}
5.基本图形的绘制
介绍Graphics拥有的绘图方法,除了矩形和卵形以外,还有多角形、填充图形和三维矩形等,所有方法都是void类型的。
drawLine(int,int,int,int) 画直线。起点坐标,终点坐标
drawRect(int,int,int,int) 画矩形。左角坐标,宽,高
drawRoundRect(int,int,int,int,int,int) 画圆角矩形。左角坐标,X宽,Y高,深度X,深度Y
draw3DRect(int,int,int,int,boolean) 画3D矩形。左角坐标,宽X,高Y,ture
drawOval(int,int,int,int) 画卵形。中心坐标,长轴,短轴
drawArc(int,int,int,int,int,int) 画弧。左角坐标,宽,高,起始角,终止角
drawPolyline(int[],int[],int) 画折线。各点的X坐标,Y坐标,折线数
drawPolygon(int[],int[],int) 画多角形。各点的X坐标,Y坐标,边数
drawPolygon(Polygon) 画多角形。定义好的多角形对象
例五:
import java.awt.*;
import java.applet.*;
public class GraphArcPolygon extends Applet {
private int cx;
private int cy;
public void paint(Graphics g) {
//定义待画组合图形的中心
Point p = new Point(cx / 2, cy / 2);
//定义待画矩形的轮廓
Rectangle rect = new Rectangle((p.x - 40), (p.y - 40), 80, 40); //定义多边形的顶点
int[] xP = {(p.x - 40), (p.x + 90), p.x+200, (p.x - 40)};
int[] yP = {(p.y - 40), (p.y +140), (p.y + 60), (p.y-40)};
g.drawArc(rect.x, rect.y, rect.width, rect.height * 2, 270, 90);
g.drawPolygon(xP, yP,3);
g.setColor(Color.red);
}
public void init() {
Toolkit tk = Toolkit.getDefaultToolkit();
Dimension d = tk.getScreenSize();
cx = d.width/2 ; cy = d.height/2;
}
}
6.画填充图形3D矩形等
import java.awt.*;
import java.applet.*;
public class Graph3DRect extends Applet {
public void paint(Graphics g) {
g.setColor(Color.green);
g.fillArc(10, 10, 60, 40, 30, 60);
g.fillOval(10, 60, 60, 40);
g.fillRect(80, 10, 60, 40);
Polygon p = new Polygon();
p.addPoint(150, 10);
p.addPoint(210, 10);
p.addPoint(210, 50);
p.addPoint(150, 50);
g.fillPolygon(p); //绘制高度为5个像素,视角为45度正方向的3维矩形
g.fill3DRect(150, 10, 60, 40, true);
for (int i=1; i<=5; i++)
g.draw3DRect(150 + i, 10 - i, 60, 40, true);
//绘制高度为5个像素,视角为135度正方向的3维矩形
g.fill3DRect(150, 60, 60, 40, true);
for (int i=1; i<=5; i++)
g.draw3DRect(150 - i, 60 + i, 60, 40, true);
}
}