您好我是java中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);
它是正常的..你能解释一下为什么吗?
答案 0 :(得分:5)
setTransform
方法仅用于在渲染后恢复原始Graphics2D
变换。话虽这么说,你应该 从不 在现有转换之上应用新的坐标转换,因为Graphics2D
可能已经有了其他目的所需的转换,例如渲染Swing组件。您的代码举例说明了这一点。要添加坐标变换,请使用transform
,rotate
,scale
或shear
方法。
答案 1 :(得分:2)
你正在绘制一些轻量级组件。这意味着它没有自己的坐标系。因此它使用了最接近重量级的parrent's coord。系统
因此,您应该将您想要进行的转换与原始转换相结合(通过将它们相乘。
完成绘图后,你(也许)应该恢复原始转换。
答案 2 :(得分:1)
扩展@ littel的answer,您可以使用下面的示例将当前transform与身份进行比较。请注意,只有翻译组件会有所不同:dx = 75.0
是MyCanvas
和Left
宽度之差的一半,而dy
包括Left
的垂直偏移和绿色边框的大小。
Identity: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] Identity: AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]] Current: AffineTransform[[1.0, 0.0, 75.0], [0.0, 1.0, 201.0]] Current: AffineTransform[[1.0, 0.0, 75.0], [0.0, 1.0, 1.0]]
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.GridLayout;
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.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setLayout(new GridLayout(0, 1));
jf.add(new MyCanvas());
jf.add(new MyCanvas());
jf.pack();
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
class MyCanvas extends JPanel {
MyCanvas() {
setLayout(new FlowLayout(FlowLayout.CENTER, 0, 0));
setPreferredSize(new Dimension(600, 200));
setBorder(BorderFactory.createLineBorder(Color.red));
add(new Left(), BorderLayout.CENTER);
}
}
class Left extends JPanel {
Left() {
setPreferredSize(new Dimension(450, 100));
setBorder(BorderFactory.createLineBorder(Color.green));
setBackground(Color.gray);
System.out.println("Identity: " + new AffineTransform());
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
System.out.println("Current: " + g2.getTransform());
g2.drawRect(getWidth() / 2 - 10, getHeight() / 2 - 10, 20, 20);
}
}
答案 3 :(得分:-2)
我知道你在哪里遇到问题,你在父母身上绘制相同的图形。 “super.paintComponent方法(克);”
你应该尝试像super.repaint();
这样的东西