《Java核心技术 卷I》Swing处理2D图形
处理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;
@Override
protected 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);
}
@Override
public 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),使用给定的起点和终点,构造一条直线。