你好,我是affineTransform在爪哇的新手。我想用它来裁剪一些我以后要用到的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());
}
}我想要在Left类中绘制的矩形显示在中间,对吧??但是它向左移动了..看起来它的坐标是相对于外部框架的。如果我移除g2.setTransform(at);,它就会恢复正常。你能解释一下为什么吗??
发布于 2011-07-15 19:45:51
我知道你的问题在哪里,你和家长画的是一样的图形。"super.paintComponent(g);“
你应该尝试像super.repaint()这样的东西;
发布于 2011-07-15 20:40:30
setTransform方法仅用于在呈现后还原原始Graphics2D变换。也就是说,您永远不应该在现有转换之上应用新的坐标转换,因为Graphics2D可能已经具有其他用途所需的转换,例如呈现Swing组件。您的代码举例说明了这一点。若要添加坐标变换,请使用transform、rotate、scale或shear方法。
发布于 2011-07-15 19:23:51
您可能正在绘制某个轻量级组件。这意味着它没有自己的坐标系。因此,它使用最接近的重量级parrent的coord。系统。
因此,您应该将您想要与原始转换进行的转换组合在一起(通过将它们相乘。
在你画完画之后,你(也许)应该恢复原来的变换。
https://stackoverflow.com/questions/6705743
复制相似问题