处理2D图形
Java1.0开始,Graphics类就包含绘制直线、矩形和椭圆等方法,但是绘制图形的操作能力有限,我们将使用Java2D的图形库。想绘制需要获得Graphics2D类的一个对象,是Graphics的子类。paintCompoent方法接收一个2D类对象,并强制转换。
Java2D库采用面向对象的方式组织几何图形,提供了直线,矩形,椭圆的类:
Line2D,Rectangle2D,Ellipse2D,都实现了Shape接口,调用draw方法绘制。
Java2D库针对像素,采用浮点坐标,而不是整数坐标,内部计算采用单精度float。
涉及到加f后缀和将double强转,都有点麻烦,设计者提供了两个版本:
- 节省空间版本,用float坐标
- 为懒惰程序员提供的版本,使用double类型的坐标(本书采用这种)
用法类似于,new Rectangle2D.Float或new Rectangle2D.Double
构造点也是,Point2D.Float和Point2D.Double
椭圆也继承一个矩形类,是椭圆的外界矩形。
图形类之间的关系
Rectangle2D和Ellipse2D队形很容易构造,需要指定:
- 左上角的x和y坐标
- 宽和高
对于椭圆,表示外界矩形:
var e = new Ellipse2D.Double(150,200,100,50);//左上角坐标150,200,宽100、高50
通过中心点构造椭圆:
var ellipse = new Ellipse2D.Double(centerX-width /2,centyY-height/2,width,height);
构造直线需要起点和终点
案例:绘制几何图形
package draw;import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.Ellipse2D;
import java.awt.geom.Rectangle2D;import javax.swing.JComponent;
import javax.swing.JFrame;public class DrawTest {public static void main(String[] args) {EventQueue.invokeLater(() -> {var frame = new DrawFrame();frame.setTitle("DrawTest");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setVisible(true);});}}class DrawFrame extends JFrame {public DrawFrame() {add(new DrawComponent());pack();}
}class DrawComponent extends JComponent {private static final int DEFAULT_WIDTH = 400;private static final int DEFAULT_HEIGHT = 400;@Overrideprotected void paintComponent(Graphics g) {var g2 = (Graphics2D)g;//画一个矩形double leftX = 100;double topY = 100;double width = 200;double height = 150;var rect = new Rectangle2D.Double(leftX, topY, width, height);g2.draw(rect);//画一个椭圆var ellipse = new Ellipse2D.Double(leftX, topY, width, height);g2.draw(ellipse);//画一个和外接矩形相同的圆心的圆double centerX = rect.getCenterX();double centerY = rect.getCenterY();double radius = 150;var circle = new Ellipse2D.Double();circle.setFrameFromCenter(centerX, centerY, centerX+radius, centerY+radius);g2.draw(circle);}@Overridepublic Dimension getPreferredSize() {return new Dimension(DEFAULT_WIDTH, DEFAULT_HEIGHT);}}
效果:
java.awt.geom.RectangularShape 1.2
- double getCenterX()
- double getCenterY()
- double getMinX()
- double getMinY()
- double getMaxX()
- double getMaxY(),返回闭合矩形的中心,以及最小、最大x和y坐标值。
- double getWidth()
- double getHeight(),返回闭合矩形的宽和高
- double getX()
- double getY(),返回闭合矩形左上角的x和y坐标
java.awt.geom.Rectangle2D.Double 1.2
- Rectangle2D.Double(double x,double y, double w,double h),利用给定的左上角、宽和高,构造一个矩形。
java.awt.geom.Ellipse2D.Double 1.2
- Ellipse2D.Double(double x,double y,double w,double h),利用有给定左上角、宽和高的外接矩形,构造一个椭圆。
java.awt.geom.Point2D.Double 1.2
- Point2D.Double(double x,double y),利用给定坐标构造一个点
java.awt.geom.Line2D.Double 1.2
- Line2D.Double(Point2D start,Point2D end)
- Line2D.Double(double startX,double startY,double endX,double endY),使用给定的起点和终点,构造一条直线。