参照资料JAVA中BufferedImage、ImageIO、Graphics2D用法和
10.3在组件中显示信息
Graphics2D一些方法(因为水印才看其中几个需要的,画图形那几个方法根本不看)
1、在窗口画一条直线:drawLine(int x1,int y1,int x2,int y2)
g.drawLine(3,3,50,50);//在(3,3)与(50,50)之间画一条线段
g.drawLine(100,100,100,100);//画一个点
2、画折线: drawPolyline(int[],int[],int),各点的x、y坐标,折线数。
3、画字符串:drawString(String str,int x,int y),x、y是开始显示的位置(项目用到)
若要精确定位,则需要知道字符串显示的长度和字高,可以通过FontMetrics类来实现
FontMetrics fm = g.getFontMetrics(font); //从Graphics对象获取FontMetrics对象
int height = fm.getHeight(); //调用其getHeight()获得字高
int width = fm.stringWidth(s1); //获得字符串宽度
应用 FontMetrics 精确定位,获取文本的宽高等。
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);
g.drawString("I will come in." ,posx +width, posy+height);
4.消除字体锯齿
// 消除边缘抗锯齿
g.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
// 文本抗锯齿
g.setRenderingHint(RenderingHints.KEY_TEXT_ANTIALIASING, RenderingHints.VALUE_TEXT_ANTIALIAS_ON);
5.setPaint(getPaint)方法可以为图形上下文上的所有后续的绘制操作选择颜色
g.setPaint(Color.RED);
g.drawString("wj",100,100);
可以用一种颜色填充一个封闭图形(例如:矩形,椭圆)的内部,为此只需要调用draw替换为fill
Rectangle2D rect=...;
g2.setPaint(Color.RED);
g2.fill(rect);
!!要想用多种颜色绘制,就需要选择一个颜色,绘制图形,再选择另外一种颜色,再绘制图形
Color定义的两种方法
方式一:Color类用于定义颜色在java.awt.Color类中定义了13个预定义的常量,它们分别表示13种标准颜色。
BLACK,BLUE,CYAN,DARK_GRAY,GRAY,GREEN,LIGHT_GRAY,
MAGENTA,ORANGE,PINK,RED,WHITE,YELLOW
方式二:可以提供三色分量来创建Color对象,从而指定一个定制颜色,红,绿,和蓝三种颜色,取值为0~255之间的整数:(项目用到new java.awt.Color创建Color)
g2.setPaint(new Color(0,128,128));
g2.drawString("Welcome!",75,125);
6.设置前景色:Color getForeground / setForeground
7.设置背景色:Color getBackground / setBackground
8.设置画笔字体:setFont(Font font);(项目用到,重点看)
要想知道特定计算机上的可用的字体,可以调用GraphicsEnvironment类的getAvailableFontFamilyName方法,这个方法将返回以一个字符串数组其中包含了所有可用的字体名,GraphicsEnvironment类描述了用户系统的图形上下文,为了的到这儿类的对象需要调用静态的 getLocal GraphicsEnvironment方法。下面这个程序会打印所有的字体名:
import java.awt.*;
public class ListFonts
{
public static void main(String[] args)
{
String[] fontNames=GraphicsEnviroment.getLocalGrapgicsEnvironment().getAvailableFontFamilyName();
for(String FontName:fontNames)
{
System.out,println(FontName);
}
}
}
AWT定义了5个逻辑字体名
SansSerif
Serif
Monospaced
Dialog
DialogInput
要想使用某种字体绘制字符,必须首先创建一个Font类的对象,需要指定字体名,字体风格和字体大小,下面是构造一个Font对象的例子
var sansbold14=new Font("SansSerif",Font.BOLD,14);
第三个参数是字体大小
第二个参数是字体的风格(常规,加粗,斜体或者粗斜体);
Font.PLAIN
Font.BOLD
Font.ITALIC
Font.BOLD+Font.ITALIC
要将字符串居中,而不是任意位置,需要知道字符串占据的宽和高的像素数,这两个值取决于下面的三个因素:(项目使用)
1.使用的字体(在这个例子中为sans serif,加粗,14点)
2.字符串(在这个例子中为”hello world“)
3.绘制字体的设备(在这个例子中为用户屏幕)
要想得到表示屏幕设备字体属性的对象,需要调用Graphics2D类中的getFontRenderContext方法,它将返回一个FontRenderContext类的对象。可以将这个对象传递给Font类的getStringBounds 方法:
FontRenderContext context=g2.getFontRenderContext();
Reectangle2D bounds=sansbold14.getStringBounds(message,context);
getStringBounds方法返回包围字符串的矩形
术语 基线(baseline)是一条虚构的线,例如,字母”e“所在的底线。上坡度(ascent)是从基线到坡顶(ascent)的距离(坡顶是”b“”k“或大写字母的上面部分)。下坡度(descent)是从基线到坡底(descenter)的距离(坡底是”p“或”g“等字母的下面部分)
行间距是某一行的坡底与其下一行的坡顶之间的空隙(这个术语源于打字机分隔行的间隔带)。字体的高度是连续两个基线之间的距离,它等于下坡度+行间距+上坡度。
getStringBounds 方法返回的矩形宽度是字符串水平方向的宽度。矩形的高度是上坡度,下坡度和行间距的综合。
这个矩形始于字符串的基线,矩形顶部的y坐标为负值,因此可以使用下面的方法获得字符串的宽度,高度和上坡度:
double stringWidth=bounds.getWidth();
double stringHeight=bounds,getHeight();
double ascent=-bounds.getY();
如果需要知道下坡度和行间距,可以使用Font类的getLineMetrics方法。
这个方法将返回一个LineMetrics类的对象,获得下坡和行间距的方法是:
LineMetrics metrics=f.getLineMetrics(message,context);
float descent=metrics.getDescent();
float leading=metrics.getLeading();
9.画各种图形
画矩形:drawRect(int x,int y,int width,int height),画矩形线框,x,y指定了左上角位置,后两个为矩形宽高;fillRect(iny x.int y,int width,int height),指定填充颜色。
g.drawRect(80,100,40,25);//画线框
g.setColor(Color.yellow);
g.fillRect(20,70,20,30);//画着色块
画圆角矩形:drawRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),线框,最后两个宽高是圆角弧的横向直径和纵向直径;fillRoundRect(int x,int y,int width,int height,int arcWidth,int arcHeight),颜色填充。
g.drawRoundRect(10,10,150,70,40,25);//画一个圆角矩形
g.setColor(Color.blue); g.fillRoundRect(80,100,100,100,60,40);//涂一个圆角矩形块
g.drawRoundRect(10,150,40,40,40,40);//画圆
g.setColor(Color.red); g.fillRoundRect(80,100,100,100,100,100);//画圆块
画三维矩形: draw3DRect(int x,int y,int width,int height,boolean raised),画一个突出显示的矩形(即3D矩形),raise是突出与否;fill3DRect(int x,int y,int width,int height,boolean raised),颜色填充。
g.draw3DRect(80,100,40,25,true);//画一个线框
g.setColor(Color.yellow); g.fill3DRect(20,70,20,30,true);//画一个着色块
画椭圆:drawOval(int x,int y,int width,int height), x、y是中心坐标,长轴、短轴;fillOval(int x,int y,int width,int height),填充。
画圆弧:drawArc(int x,int y,int width,int height,int startAngle,int arcAngle),画椭圆一部分的圆弧线,椭圆中心时它的外接矩形的中心,外接矩形左上角坐标为(x,y),宽width,高height,startAngle单位是度,其实角度0度是指3点钟方向,startAngle和arcAngle表示从startAngle角度开始,逆时针方向画arcAngle度的弧,约定,正值度数是逆时针方向,负数为顺时针,例如-90°是6点钟方向;fillArc(int x,int y,int width, int height, int startAngle, int arcAngle),着色。
g.drawArc(10,40,90,50,0,180);//画圆弧线
g.drawArc(100,40,90,50,180,180);//画圆弧线
g.setColor(Color.yellow); g.fillArc(10,100,40,40,0,-270);//填充缺右上角的四分之三的椭圆
g.setColor(Color.green); g.fillArc(60,110,110,60,-90,-270);//填充缺左下角的四分之三的椭圆
画多边形:drawPolygon(int xPoints[],int yPoints[],int nPoints),多边形是多条线段首尾连接而成的封笔平面图,多边形线段端点的x,y坐标存储在两个数组中,画多边形就是按给定的坐标点顺序用直线段将它们连起来,nPoints是坐标点个数;fillPolygon(int xPoints[],int yPoints[],int nPoints),着色。
int px1[]={50,90,10,50};//首末点相重,才能画多边形
int py1[]={10,50,50,10};
int px2[]={140,180,170,180,140,100,110,140};
int py2[]={5,25,35,45,65,35,25,5};
g.setColor(Color.blue);
g.fillPolygon(px1,py1,4);
g.setColor(Color.red);
g.drawPolygon(px2,py2,9);
画图片:drawImage(Image image,int x,int y)
在图片上画图片时(水印),设置与原图组合方式(项目用到)
// 原图和水印图的组合方式,alpha:透明度0-->1
g.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_ATOP, alpha));
组合方式:
AlphaComposite.CLEAR -交集部分的颜色和透明被清除。
AlphaComposite.DST - 目标未修改。
AlphaComposite.DST_ATOP - 目标和源重叠的部分组合在源上。
AlphaComposite.DST_IN -显示目标和源重叠的部分。
AlphaComposite.DST_OUT -显示目标没有和源重叠的部分。
AlphaComposite.DST_OVER - 目标覆盖在源之上。
AlphaComposite.SRC -源复制给目标。
AlphaComposite.SRC_ATOP - 源和目标重叠的部分组合在目标上。
AlphaComposite.SRC_IN - 显示源和目标重叠的部分。
AlphaComposite.SRC_OUT -显示源没有和目标重叠的部分。
AlphaComposite.SRC_OVER - 源覆盖在目标之上
10.限定作图显示区域:clipRect(int x,int y,int width,int height),用一个矩形表示图形的显示区域,超出部分不显示,多个限制区有覆盖时,得到交集区域
g.clipRect(0,0,100,50);g.clipRect(50,25,100,50);
11。复制图形:copyArea(int x,int y,int width,int height,int dx,int dy),dx和dy表示将图形复制到原位置偏移的像素点数,正值为往右或往下偏移,负值为往左或往上偏移,x、y是要复制矩形区域的左上角坐标。以下代码将一个矩形的部分、另一个矩形的全部分别平移
g.drawRect(10,10,60,90);
g.fillRect(90,10,60,90);
g.copyArea(40,50,60,70,-20,80);
g.copyArea(110,50,60,60,10,80);
12.对Point、Rectangle类的应用
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);