cod*_*der 3 java swing java-2d affinetransform
你好我是affineTransformjava 新手.我想用它来剪切一些我以后要使用的GUI.现在我只想测试一个示例代码,但我无法解释它的输出.这是代码
package main;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MainClass{
public static void main(String[] args) {
JFrame jf = new JFrame("Demo");
jf.getContentPane().add(new MyCanvas());
jf.setSize(600, 600);
jf.setVisible(true);
}
}
class Left extends JPanel {
Left(){
setPreferredSize(new Dimension(450,450));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
AffineTransform at = new AffineTransform();
g2.setTransform(at);
g2.drawRect(getWidth()/2 - 10, getHeight()/2 - 10, 20, 20);
}
}
class MyCanvas extends JPanel {
MyCanvas()
{
setBorder(BorderFactory.createLineBorder(Color.red));
setLayout(new FlowLayout(FlowLayout.CENTER));
add(new Left());
}
}
Run Code Online (Sandbox Code Playgroud)
我要在Left班级节目中画出的矩形出现在中间右边?但它的移动向左移动了......似乎它的坐标与外框相对.如果我删除g2.setTransform(at);它是正常的..你能解释我为什么?
该setTransform方法仅用于Graphics2D在渲染后恢复原始变换.话虽这么说,你永远不应该在现有变换之上应用新的坐标变换,因为Graphics2D可能已经有了其他目的所需的变换,例如渲染Swing组件.您的代码举例说明了这一点.要添加坐标变换,使用transform,rotate,scale,或shear方法.