52 g2d.fillRect(20, 20, 60, 60);
53 //7. 这里需要还原,否则会影响后面的变换
54 g2d.setTransform(oldTrans);
55 }
56 //该方法和paintWithGraphicsMethod机制是一致的,只是应用的方法改为
57 //AffineTransform提供的变换方法
58 private void paintWithTransform(Graphics g) {
59 Graphics2D g2d = (Graphics2D) g;
60 AffineTransform oldTrans = g2d.getTransform();
61 //1. 先将坐标系的原点移到第二个泳道中,以便后面的代码可以和其他
62 //函数中的代码保持一致
63 g2d.translate(0, getHeight()/4);
64 g2d.setColor(Color.red);
65 g2d.fillRect(20, 20, 60, 60);
66
67 AffineTransform tx1 = new AffineTransform();
68 tx1.translate(160, 0);
69 //2. 这里用到的transform方法在Graphics对象内部也是组合方式的,
70 //换句话说,后面的transform方法将会基于本次变化的结果。
71 g2d.transform(tx1);
72 g2d.fillRect(20, 20, 60, 60);
73
74 AffineTransform tx2 = new AffineTransform();
75 tx2.translate(160, 0);
76 tx2.rotate(Math.PI / 4);
77 //3. 本次transform将基于1)中transform的结果并进行组合
78 g2d.transform(tx2);
79 g2d.fillRect(20, 20, 60, 60);
80
81 AffineTransform tx3 = new AffineTransform();
82 //4. 这里的rotate的作用和上面的paintWithGraphicsMethod()方法的4)是一致的。
83 tx3.rotate(-Math.PI / 4);
84 tx3.translate(160, 0);
85 tx3.scale(1.5, 1.5);
86 g2d.transform(tx3);
87 g2d.fillRect(20, 20, 60, 60);
88 //5. 切变变换
89 AffineTransform tx4 = new AffineTransform();
90 tx4.shear(0.5, 0);
91 tx4.translate(160, 0);
92 g2d.transform(tx4);
93 g2d.fillRect(20, 20, 60, 60);
94 g2d.setTransform(oldTrans);
95 }
96 //通过setTransform方法基于绝对坐标进行变换
97 private void paintWithSetTransform(Graphics g) {
98 Graphics2D g2d = (Graphics2D) g;
99 AffineTransform oldTrans = g2d.getTransform();
100 //1. 先将坐标系的原点移到第三个泳道中,以便后面的代码可以和其他
101 //函数中的代码保持一致
102 g2d.translate(0, getHeight()/2);
103 g2d.setColor(Color.blue);
104 g2d.fillRect(20, 20, 60, 60);
105 AffineTransform tx1 = new AffineTransform();
106 //2. 由于setTransform方法是直接替换为参数中的变换对象,之前驻留在Graphics中的
107 //变换对象都不在起作用了,因此这里在平移时,需要基于最原始的(窗体左上角)原点坐标
108 //进行平移变换,可以理解为绝对平移变换。
109 //可以看到translate中的y参数是相对于最初原点的平移距离。
110 tx1.translate(160, getHeight()/2);
111 //3. 将g2d中的变换对象直接替换为参数对象。
112 g2d.setTransform(tx1);
113 g2d.fillRect(20, 20, 60, 60);
114
115 AffineTransform tx2 = new AffineTransform();
116 //4. 道理和上面的代码一样,可以看到这个时候x参数也设定为绝对距离了。
117 tx2.translate(320, getHeight()/2);
118 tx2.rotate(Math.PI / 4);
119 g2d.setTransform(tx2);
120 g2d.fillRect(20, 20, 60, 60);
121
122 AffineTransform tx3 = new AffineTransform();
123