【问题标题】:Java Graphics2D AffineTransform Image RotationJava Graphics2D AffineTransform 图像旋转
【发布时间】:2015-03-04 08:48:51
【问题描述】:

我正在尝试像这样在 for 循环中简单地旋转图像:

class MyCanvas extends JComponent {

AffineTransform identity = new AffineTransform();
Image arrow;
Double angle = -180.0;

public void spin() {
    angle += 10.0;
    for(int i = 0; i < 10; i++) {
        repaint();
        System.out.println(i);
        try {
            Thread.sleep(1000);
        } catch (InterruptedException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
    }
}
public void paint(Graphics g) {
    Graphics2D g2 = (Graphics2D) g;
    arrow = Toolkit.getDefaultToolkit().getImage("red-arrow-right-th.png");
    // Rotate + translate
    AffineTransform trans = new AffineTransform();
    trans.setTransform(identity);
    trans.translate(getWidth()/2, getHeight()/2);
    trans.rotate(Math.toRadians(angle));
    System.out.println(trans);
    g2.drawImage(arrow, trans, this);
    g2.finalize();
}
}

但是,当我在 main 中运行 call spin() 时,它似乎只应用了一次旋转,同时仍能正确打印出循环。我忽略了什么?

【问题讨论】:

  • 我建议使用 rotate 方法,该方法为您提供了设置旋转将围绕其进行的锚点的方法。我认为默认情况下旋转是平移点的顶部/位置...
  • 1-不要覆盖paint,覆盖paintComponent; 2- 在执行任何自定义绘画之前调用 super.paint/Component; 3-永远不要对任何东西调用finalize,尤其是对不是你自己创建的对象。注意,Swing 不是线程安全的,你不应该调用任何可能阻塞事件调度线程的东西,考虑使用 Swing 定时器

标签: java swing


【解决方案1】:

我已经根据 MadProgrammer 的建议转换了您的代码:

  • 不要覆盖paint,覆盖paintComponent
  • 在执行任何自定义绘画之前,请致电 super.paint
  • 切勿在任何事情上调用finalize,尤其是在不是您自己创建的对象上。
  • 使用Swing Timer

注意以下事项

  • qualified this 用于从 ActionListener 内部类访问 ImageRotationView 实例。

  • AffineTransform.getRotateInstance 返回一个围绕锚点旋转坐标的变换。

  • 速度可以优化,但它可以像这样正常工作。
  • 这个类作为一个独立的应用程序工作
  • 名为dice.png 的文件应该存在于基本目录中。

.

import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JComponent;
import javax.swing.JFrame;
import javax.swing.Timer;


public class ImageRotationFrame {

    public static void main(String[] args) {
        new ImageRotationFrame();
    }

    public ImageRotationFrame() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                JFrame frame = new JFrame("Testing");
                frame.setSize(400, 400);
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new ImageRotationComponent());
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }
        });

    }

    private class ImageRotationComponent extends JComponent {

        Image arrow;
        double angle = 0.0;

        @Override
        protected void paintComponent(Graphics g) {
            super.paintComponent(g);
            angle += 0.4;
            AffineTransform trans = AffineTransform.getRotateInstance(angle, getWidth() / 2, getHeight() / 2);
            ((Graphics2D) g).drawImage(arrow, trans, this);
        }

        public ImageRotationComponent() {
            try {
                arrow = ImageIO.read(new File("dice.png"));
            } catch (IOException e) {
                e.printStackTrace();
            }
            int delay = 500; //milliseconds
            ActionListener taskPerformer = new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent evt) {
                    ImageRotationComponent.this.repaint();
                }
            };
            new Timer(delay, taskPerformer).start();
        }
    }
}

【讨论】:

    猜你喜欢
    • 2013-12-15
    • 2014-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-11-07
    • 2018-08-16
    • 1970-01-01
    • 2011-01-15
    相关资源
    最近更新 更多