AffineTransform的问题

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);它是正常的..你能解释我为什么?

mre*_*mre 6

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

  • @little:我既不是选民也不是主持人;我在大约11个小时前投票了。看来这里的所有答案都被系统地否决了,大约有30个答案。您可以[审核](http://meta.stackexchange.com/questions/43004/how-do-i-audit-my-reputation)您的帐户以了解更多信息。如果自动[欺诈检测机制](http://meta.stackexchange.com/questions/19920/how-does-the-so-voter-fraud-detection-mechanism-work)无法捕获,则可以标记引起主持人注意。我一直都受到打击。 (2认同)