import java.awt.Font;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.RenderingHints;
import java.awt.Shape;
import java.awt.font.FontRenderContext;
import java.awt.font.GlyphVector;
import java.awt.geom.AffineTransform;
import java.awt.geom.Point2D;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class RotatedText extends JPanel{
public void paint(Graphics g){
Graphics2D g2d = (Graphics2D)g;
//Rendering:渲染、效果图 Hint:提示
//RenderingHints 类定义和管理键和关联值的集合,它允许应用程序将输入提供给其他类使用的算法选择,
//这些类执行呈现和图像处理服务。key_antialiasing抗锯齿提示键。
//value_antialias抗锯齿提示值——使用抗锯齿模式完成呈现.antialias :平滑
g2d.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
String s = "你好你好你好你好你好你好你好你好你好你好你好你好你好你好你好";
Font font = new Font("Courier", Font.PLAIN, 12);
//translate:将 Graphics2D 上下文的原点平移到当前坐标系中的点 (x, y)。
g2d.translate(20, 20);//translate:翻译、转化、调动
//FontRenderContext 类是正确测量文本所需的信息容器。
FontRenderContext frc = g2d.getFontRenderContext();//获取此 Graphics2D 上下文中 Font 的呈现上下文。
//GlyphVector 对象是一个字形的集合,包含在转换坐标空间中放置每个字形的几何信息,
//该坐标空间对应于最终要显示 GlyphVector 的设备。 glyph:字形,标志符号
//根据此 Font 中的 Unicode cmap 将字符一一映射到字形,从而创建一个 GlyphVector。
GlyphVector gv = font.createGlyphVector(frc, s);
int length = gv.getNumGlyphs();//返回此 GlyphVector 中的字形数。
for(int i = 0; i < length; i++){
Point2D p = gv.getGlyphPosition(i);//Point2D 类定义表示 (x,y) 坐标空间中位置的点。
/**
* AffineTransform 类表示 2D 仿射变换,它执行从 2D 坐标到其他 2D 坐标的线性映射,保留了线的“直线性”和“平行性”。
* 可以使用一系列平移 (translation)、缩放 (scale)、翻转 (flip)、旋转 (rotation) 和错切 (shear) 来构造仿射变换。
*/
AffineTransform at = AffineTransform.getTranslateInstance(p.getX(), p.getY());
/**getTranslateInstance()
* 返回表示平移变换的变换。表示返回变换的矩阵是:
[ 1 0 tx ]
[ 0 1 ty ]
[ 0 0 1 ]
参数:
tx - 坐标在 X 轴方向上平移的距离
ty - 坐标在 Y 轴方向上平移的距离
*/
//rotate:使旋转
/**
* 连接此变换与旋转变换。这等效于调用 concatenate(R),其中 R 为 AffineTransform,由以下矩阵表示:
[ cos(theta) -sin(theta) 0 ]
[ sin(theta) cos(theta) 0 ]
[ 0 0 1 ]
用正角度 theta 进行的旋转将 X 正半轴上的点向 Y 正半轴旋转。还要注意上文处理 90 度旋转的讨论。
参数:
theta - 用弧度测量的旋转角度
*/
at.rotate((double)i / (double)(length - 1) * Math.PI / 3);
//getGlyphOutline()返回其内部区域与此 GlyphVector 中指定字形的可视表示形式对应的 Shape。
//此方法返回的轮廓位于各个字形的原点周围。
Shape glyph = gv.getGlyphOutline(i);
Shape transformedGlyph = at.createTransformedShape(glyph);
g2d.fill(transformedGlyph);
}
}
public static void main(String[] args) {
JFrame f = new JFrame();
f.add(new RotatedText());
f.setSize(400,300);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLocationRelativeTo(null);
f.setVisible(true);
}
}