Java how to program(Third Edition II)
——手记
第十一章 图形和Java2D
1.由于窗口最左上角的坐标(0,0)实际上是标题栏的后面。所以,使用坐标绘制图形时应该调整它到窗口边框的里面。Container类(java中所有窗口类的超类)中有一个专门针对该目的的方法getInsets,它能返回一个Insets对象(java.awt包)。Insets对象中有4个public成员——top,bottom,left和right,它们代表了窗口中可绘制区域的四条边。
2.Graphics是一个抽象类,这是由Java的可移植性决定的。在支持Java的各个平台上,绘图的实现是不同的,还没有一个能在所有系统上实现绘图功能的类。在各种平台上使用Java时,系统创建Graphics的一个派生类,由它来实际实现所有的绘图功能,为用户提供界面Graphics类,使我们能够编写以独立与平台的方式使用图形的程序,将其实现隐蔽起来。
3.Color方法和与颜色相关的Graphics方法:
1)public Color(int r,int g,int b) //在红、绿、蓝颜色含量的基础上创建一种颜色,每种含量都用0~255之间的一个整数表示;
2)public Color(float r,float g,float b) //在红、绿、蓝颜色含量的基础上创建一种颜色,每种含量都用0.0.~1.0之间的一个浮点数表示;
3)public int getRed() //返回一个0~255之间表示红色含量的值;
4)public Color getColor() //返回一个代表图形上下文当前颜色的Color对象;
5)publc setColor(color c) //设置图形上下文设置当前绘图颜色。
4.Java选择颜色的GUI控件JcolorChooser(javax.swing包)。
JcolorChooser类的static方法showDialog显示颜色选择对话框。该方法返回被选择的Color对象(如果按下cancel键,或没有按下OK键就关闭了对话框,则返回null)。
showDialog方法有三个参数,第一个指向其父控件,String为对话框标题栏显示的信息,最后一个为对话框中选中的初始颜色。
5.字体的构造函数和Graphics类方法setFont:
1)public Font(String name, int style,int size) //用指定的字体,风格和大小创建一个Font对象。
2)public int getStyle(); public String getName(); public int getSize();
public String getFamily();
3)public boolean isPlain(); pulbic boolean isBold(); public boolean isItalic();
4)public Font getFont(); //返回一个字体对象的引用,表示但前字体;
5)public void setFont(Font f); //设置当前字体为Font对象指定的字体,风格和大小;
6.用于绘制直线、矩形和椭圆的Graphics方法:
1)public void drawLine(int x1,int y1,int x2,int y2);
2)public void drawRect(int x,int y,int width,int height); //用指定的参数画一个空心的矩形
3)public void fillRect(int x,int y,int width,int height); //用指定的参数画一个实心的矩形
4)public void clearRect(int x,int y,int width,int height); //用当前背景色绘制一个矩形;
5)public void drawRoundRect(int x,int y,int with,int height,int arcWidth,int arcHeight);//其中arcWidth和arcHeight决定其圆角
6)public void fillRoundRect(int x,int y,int with,int height,int arcWidth,int arcHeight);
7)public void draw3DRect(int x,int y,int with,int height,boolean b);//b为true时,矩形为突出,false则凹陷;
8)public void fill3DRect(int x,int y,int with,int height,boolean b);
9)public void drawOval(int x,int y,int with,int height);
10) public void fillOval(int x,int y,int with,int height);
7.新的Java2D API提供了高级的二维图形功能,这些都在下列包中:java.awt, java.awt.image, java.awt.color, java.awt.font, java.awt.geom, java.awt.print, java.awt.image.renderable。
8.实例分析:
1)源代码:
package Shapes;
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.awt.geom.*;
import java.awt.image.*;
public class Shapes extends JFrame{
public Shapes(){
super("Drawing 2D shapes");
setSize(425,160);
show();
}
public void paint(Graphics g){
Graphics2D g2d=(Graphics2D)g;
g2d.setPaint(//setPaint 方法设置paint对象,以决定显示的颜色和形状;
new GradientPaint(5,30,Color.blue,35,100,Color.green,false)//最后一个参数
//false表示渐变颜色不循环;
);
g2d.fill(new Ellipse2D.Double(5,30,65,100)); //使用双精度的浮点数设置尺寸;
g2d.setPaint(Color.red);
g2d.setStroke(new BasicStroke(10.0f)); //设置画笔的宽度为10象素;
g2d.draw(new Rectangle2D.Double(80,30,65,100));
//BufferedImage对象生成花纹,BufferedImage类可以用颜色和灰度来产生图形,该
//处的10,10表示BufferedImage10个象素宽,10个象素高,BufferedImage.TYPE_INT_RGB
//表示图像中存储的颜色用RGB体系;
BufferedImage buffImage=new BufferedImage(10,10,BufferedImage.TYPE_INT_RGB);
Graphics2D gg=buffImage.createGraphics(); //在BufferedImage中绘制图形;
gg.setColor(Color.yellow);
gg.fillRect(0,0,10,10);
gg.setColor(Color.black);
gg.drawRect(1,1,6,6);
gg.setColor(Color.blue);
gg.fillRect(1,1,3,3);
gg.setColor(Color.red);
gg.fillRect(4,4,3,3);
g2d.setPaint(
new TexturePaint(buffImage,new Rectangle(10,10)) //TextturePaint对象用存储在
//BufferedImage中的图像作为填充纹理来填充图形;
);
g2d.fill(new RoundRectangle2D.Double(155,30,75,100,50,50));
g2d.setPaint(Color.white);
g2d.setStroke(new BasicStroke(6.0f));
g2d.draw(
new Arc2D.Double(240,30,75,100,0,270,Arc2D.PIE)//Arc2D.PIE常量指出是用两条
//直线封闭弧形, Arc2D.CHORD表示将画一条从起点到终点的直线,Arc2D.OPEN表示不封闭;
);
g2d.setPaint(Color.green);
g2d.draw(new Line2D.Double(395,30,320,150));
float dashes[]={10};
g2d.setPaint(Color.yellow);
g2d.setStroke(
new BasicStroke(4,BasicStroke.CAP_ROUND,//设置画笔4个象素,端点有为圆角;
BasicStroke.JOIN_ROUND, //线条汇合处也为圆角;
10,dashes,0) //dashes表示小段虚线的长度;
//0表示dashes数组中的起始位置;
);
g2d.draw(new Line2D.Double(320,30,395,150));
}
public static void main(String args[]){
Shapes app=new Shapes();
app.addWindowListener(
new WindowAdapter(){
public void windowClosing(WindowEvent e){
System.exit(0);
}
}
);
}
}
<shapetype id="_x0000_t75" stroked="f" filled="f" path="m@4@5l@4@11@9@11@9@5xe" o:preferrelative="t" o:spt="75" coordsize="21600,21600"></shapetype><stroke joinstyle="miter"></stroke><formulas></formulas><f eqn="if lineDrawn pixelLineWidth 0"></f><f eqn="sum @0 1 0"></f><f eqn="sum 0 0 @1"></f><f eqn="prod @2 1 2"></f><f eqn="prod @3 21600 pixelWidth"></f><f eqn="prod @3 21600 pixelHeight"></f><f eqn="sum @0 0 1"></f><f eqn="prod @6 1 2"></f><f eqn="prod @7 21600 pixelWidth"></f><f eqn="sum @8 21600 0"></f><f eqn="prod @7 21600 pixelHeight"></f><f eqn="sum @10 21600 0"></f><lock aspectratio="t" v:ext="edit"></lock><shape id="_x0000_i1025" style="WIDTH: 318.75pt; HEIGHT: 120pt" type="#_x0000_t75"></shape><imagedata o:title="" src="file:///C:/DOCUME~1/haidao/LOCALS~1/Temp/msohtml1/01/clip_image001.png"></imagedata>
第十二章 基本图形用户界面构件
1.Swing构件经常被称为轻量级构件,因为他们是用Java写成的,所以就不需要使用那些相关于各种平台的复杂GUI功能。AWT(Abstract Windows Toolkit)构件(许多和Swing构件功能相同)被系在各自的本地平台上,相应的称为重量级构件,因为他们依赖于本地平台的窗口系统来决定他们的功能、外观和风格。
2.为了处理图形用户界面事件,需要注册事件侦听器和实现事件处理。一个GUI事件的事件侦听器是一个对象,此对象的类实现了java.awt.event包和javax.swing.event包中一个或多个事件侦听器的接口。