3

你好,我是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());
    }


}

我想在Left课堂展示中绘制的矩形出现在中间对吗??但是它的到来向左移动了。它似乎是相对于外部框架的坐标。如果我删除g2.setTransform(at);它会正常..你能解释一下为什么吗?

4

4 回答 4

7

setTransform方法仅用于Graphics2D在渲染后恢复原始变换。话虽如此,您永远不应该在现有变换之上应用新的坐标变换,因为Graphics2D可能已经有其他用途所需的变换,例如渲染 Swing 组件。您的代码说明了这一点。要添加坐标变换,请使用transformrotatescaleshear方法。

于 2011-07-15T12:40:29.810 回答
3

您可能正在绘制一些轻量级组件。这意味着它没有自己的坐标系。所以它使用它最接近的重量级父坐标。系统。

因此,您应该将要进行的转换与原始转换相结合(通过将它们相乘。

在你画完之后,你(也许)应该恢复原来的变换。

于 2011-07-15T11:23:51.333 回答
2

扩展@littel 的答案,您可以使用以下示例将当前转换与身份进行比较,因为框架已调整大小。请注意,只有平移分量不同:dx = 75.0MyCanvas和的宽度差的一半Left,而dy包括绿色边框的垂直偏移Left和大小。

身份:AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
身份:AffineTransform[[1.0, 0.0, 0.0], [0.0, 1.0, 0.0]]
当前:AffineTransform[[1.0, 0.0, 75.0], [0.0, 1.0, 201.0]]
当前: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);
    }
}
于 2011-07-16T19:44:42.100 回答
-3

我知道你的问题在哪里,你在与父级相同的图形上绘制。“super.paintComponent(g);”

你应该尝试类似 super.repaint();

于 2011-07-15T11:45:50.730 回答