来源:http://blog.csdn.net/rexih/article/details/46445225
Graphics2D类包含绘制直线,矩形,椭圆等方法
Component的paintComponent方法会自动获取一个Graphics2D对象,但是参数列表定义的是Graphics对象,通过强转来使用
Graphics2D g2d=(Graphics2D)g;
绘制具体图形的类 : Line2D,Rectangle2D,Ellipse2D,Point2D
绘制图形的步骤:
1.获取一个Graphics2D对象
2.创建一个实现Shape接口的图形对象,设置好其属性
3.调用Graphics2D的draw 方法
像素坐标的类型:
1.最初是int型,表示屏幕上的像素坐标
2.Java 2D库采用浮点型
a.这样可以转换成更有意义的单位,比如微米,英寸
b.屏幕使用单精度即可,而且float存储空间小,计算速度可能比double快
3.为了方便通常使用Double。 float在赋值时需要手动添加f,double型的返回值需要强转成float
所以,图形类通常有两个静态内部类作为子类Float和Double,比如Rectangle2D.Float/Rectangle2D.Double
对于这两个子类:
1.子类只覆盖了超类的方法,所以可以用超类的对象变量直接引用。Rectangle2D rect=new Rectangle2D.Double(...);
2.Rectangle2D的方法返回值都是double,引用的对象是Rectangle2D.Float的话,调用方法,比如getWidth,返回值也是double
常用(特殊)的构造图形的情况:
1.矩形 知道对角点
使用rect.setFrameFromDiagonal(px,py,qx,qy);
或者参数为2个Point2D对象 rect.setFrameFromDiagonal(p,q);
2.矩形 知道中心点和对角点
使用rect.setFrameFromCenter(px,py,qx,qy);rect.setFrameFromCenter(p,q);
3.椭圆 知道中心点和长 宽
ellipse.setFrameFromCenter(cx,cy,cx-width/2,cy-height/2);
画圆:ellipse.setFrameFromCenter(cx,cy,cx+radius,cy+radius);
4.知道椭圆的矩形框架
ellipse.setFrame(rect);
5.画直线
new Line2D.Double(sx,sy,ex,ey);
new Line2D.Double(p,q);
- import java.awt.*;
- import java.awt.geom.*;
- import javax.swing.*;
-
- public class DrawTest {
-
- public static void main(String[] args) {
- EventQueue.invokeLater(new Runnable(){
- public void run() {
- DrawImg f=new DrawImg();
- }
- });
- }
- }
-
- class DrawImg extends JFrame{
- DrawImg(){
- setLocationByPlatform(true);
- setTitle("draw test");
- setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
- getContentPane().add(new DrawComponent());
- pack();
- setVisible(true);
- }
- }
-
- class DrawComponent extends JComponent{
- private static final int DEFAULT_W=600;
- private static final int DEFAULT_H=600;
- DrawComponent(){
- setPreferredSize(new Dimension(DEFAULT_W,DEFAULT_H));
- }
- public void paintComponent(Graphics g){
- Graphics2D g2d=(Graphics2D)g;
-
- double centerX=DEFAULT_W/2;
- double centerY=DEFAULT_H/2;
-
- double conerX=centerX+100;
- double conerY=centerY+100;
-
- Rectangle2D rect =new Rectangle2D.Double();
- rect.setFrameFromCenter(centerX,centerY,conerX,conerY);
-
- Ellipse2D ellipse=new Ellipse2D.Double();
- ellipse.setFrame(rect);
-
- Ellipse2D circle=new Ellipse2D.Double();
- double radius=Point2D.distance(centerX, centerY, conerX, conerY);
- circle.setFrameFromCenter(centerX,centerY,centerX+radius,centerY+radius);
-
- Line2D line= new Line2D.Double(conerX,conerY,conerX-200,conerY-200);
- Line2D line2= new Line2D.Double(conerX-200,conerY,conerX,conerY-200);
-
-
- g2d.draw(rect);
-
- g2d.draw(ellipse);
- g2d.draw(circle);
-
- g2d.draw(line);
- g2d.draw(line2);
- }
- }