Java 基于按键旋转图像

Java 基于按键旋转图像,java,swing,rotation,keylistener,key-bindings,Java,Swing,Rotation,Keylistener,Key Bindings,我试图修改一个现有代码,根据按键旋转图像。到目前为止,我已经成功地做到了以下几点,我被卡住了。我第一次使用仿射变换。当图像的旋转次数与按下右键的次数相同时,图像仅旋转一次 package aircraftPackage; import java.awt.Graphics; import java.awt.Graphics2D; import java.awt.Image; import java.awt.MediaTracker; import java.awt.event.KeyEvent;

我试图修改一个现有代码,根据按键旋转图像。到目前为止,我已经成功地做到了以下几点,我被卡住了。我第一次使用仿射变换。当图像的旋转次数与按下右键的次数相同时,图像仅旋转一次

package aircraftPackage;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class RotateImage extends JFrame implements KeyListener {
    private static final long serialVersionUID = 1L;
    private Image TestImage;
    private BufferedImage bf;
    private int cordX = 100;
    private int cordY = 100;
    private double currentAngle;

    public RotateImage(Image TestImage) {
     this.TestImage = TestImage;
     MediaTracker mt = new MediaTracker(this);
     mt.addImage(TestImage, 0);
     try {
       mt.waitForID(0);
     }
     catch (Exception e) {
       e.printStackTrace();
     }
        setTitle("Testing....");
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }
public void rotate() {
     //rotate 5 degrees at a time
     currentAngle+=5.0;
     if (currentAngle >= 360.0) {
       currentAngle = 0;
     }
     repaint();
   }


    public void imageLoader() {
        try {
            String testPath = "test.png";
            TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));

        } catch (IOException ex) {
            ex.printStackTrace();
        }

        addKeyListener(this);
    }

    public void update(Graphics g){
           paint(g);
    }

    public void paint(Graphics g){

        bf = new BufferedImage( this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB);

    try{
    animation(bf.getGraphics());
    g.drawImage(bf,0,0,null);
    }catch(Exception ex){

    }
}

    public void animation(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform origXform = g2d.getTransform();
        AffineTransform newXform = (AffineTransform)(origXform.clone());
        //center of rotation is center of the panel
        int xRot = this.getWidth()/2;
        int yRot = this.getHeight()/2;
        newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
        g2d.setTransform(newXform);
        //draw image centered in panel
        int x = (getWidth() - TestImage.getWidth(this))/2;
        int y = (getHeight() - TestImage.getHeight(this))/2;
        g2d.drawImage(TestImage, x, y, this);
        g2d.setTransform(origXform);
        g.drawImage(TestImage, cordX, cordY, this);
    }

    public static void main(String[] args) {

        new RotateImage(null);
    }

    public void keyPressed(KeyEvent ke) {
            final RotateImage ri = new RotateImage(TestImage);

        switch (ke.getKeyCode()) {
        case KeyEvent.VK_RIGHT: {
            cordX += 5;

           ri.rotate();
        }
            break;
        case KeyEvent.VK_LEFT: {
            cordX -= 5;
        }
            break;
        case KeyEvent.VK_DOWN: {
            cordY += 5;
        }
            break;
        case KeyEvent.VK_UP: {
            cordY -= 3;
        }
            break;
        }
        repaint();
    }

    public void keyTyped(KeyEvent ke) {
    }

    public void keyReleased(KeyEvent ke) {
    }
}
如果有人能纠正我在哪里犯的错误,我会很有帮助的。
感谢您在每个事件关键点上创建新的旋转图像时遇到的问题,使其看起来不起作用 尝试在每个关键事件上将此行的位置更改为不可修改

public static void main(String[] args) {

        new RotateImage(null);
    }

    public void keyPressed(KeyEvent ke) {
            final RotateImage ri = new RotateImage(TestImage);
更新:

原因是构造函数的值为null,所以应该传递image

new RotateImage(null);
在代码中修改此选项

1) 让它静止

private static Image TestImage;
2) 定义

3) 像这样打电话进来

public static void main(String[] args) {
         ri = new RotateImage(TestImage);
    }
步骤4(已删除)

更新:

更新2:

这是完整的代码,它工作得非常完美(右键)不要忘记将图像包含在同一个包中,并且图像类型相同

package aircraftPackage;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class RotateImage extends JFrame implements KeyListener {
    private static final long serialVersionUID = 1L;
    private static Image TestImage;
    private static RotateImage ri;
    private BufferedImage bf;
    private int cordX = 100;
    private int cordY = 100;
    private double currentAngle;

    public RotateImage(Image TestImage) {
     this.TestImage = TestImage;
     MediaTracker mt = new MediaTracker(this);
     mt.addImage(TestImage, 0);
     try {
       mt.waitForID(0);
     }
     catch (Exception e) {
       e.printStackTrace();
     }
        setTitle("Testing....");
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }
public void rotate() {
     //rotate 5 degrees at a time
     currentAngle+=5.0;
     if (currentAngle >= 360.0) {
       currentAngle = 0;
     }
     repaint();
   }


    public void imageLoader() {
        try {
            String testPath = "test.png";
            TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));

        } catch (IOException ex) {
            ex.printStackTrace();
        }

        addKeyListener(this);
    }

    public void update(Graphics g){
           paint(g);
    }

    public void paint(Graphics g){

        bf = new BufferedImage( this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB);

    try{
    animation(bf.getGraphics());
    g.drawImage(bf,0,0,null);
    }catch(Exception ex){

    }
}

    public void animation(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform origXform = g2d.getTransform();
        AffineTransform newXform = (AffineTransform)(origXform.clone());
        //center of rotation is center of the panel
        int xRot = this.getWidth()/2;
        int yRot = this.getHeight()/2;
        newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
        g2d.setTransform(newXform);
        //draw image centered in panel
        int x = (getWidth() - TestImage.getWidth(this))/2;
        int y = (getHeight() - TestImage.getHeight(this))/2;
        g2d.drawImage(TestImage, x, y, this);
        g2d.setTransform(origXform);
        g.drawImage(TestImage, cordX, cordY, this);
    }

    public static void main(String[] args) {
         ri = new RotateImage(TestImage);

    }

    public void keyPressed(KeyEvent ke) {

        switch (ke.getKeyCode()) {
        case KeyEvent.VK_RIGHT: {
            cordX += 5;

           ri.rotate();
        }
            break;
        case KeyEvent.VK_LEFT: {
            cordX -= 5;
            ri.rotate();
        }
            break;
        case KeyEvent.VK_DOWN: {
            cordY += 5;
            ri.rotate();
        }
            break;
        case KeyEvent.VK_UP: {
            cordY -= 3;
            ri.rotate();
        }
            break;
        }
        repaint();
    }

    public void keyTyped(KeyEvent ke) {
    }

    public void keyReleased(KeyEvent ke) {
    }
}

您在每个事件关键点上创建新的旋转图像时遇到的问题是,它看起来不起作用 尝试在每个关键事件上将此行的位置更改为不可修改

public static void main(String[] args) {

        new RotateImage(null);
    }

    public void keyPressed(KeyEvent ke) {
            final RotateImage ri = new RotateImage(TestImage);
更新:

原因是构造函数的值为null,所以应该传递image

new RotateImage(null);
在代码中修改此选项

1) 让它静止

private static Image TestImage;
2) 定义

3) 像这样打电话进来

public static void main(String[] args) {
         ri = new RotateImage(TestImage);
    }
步骤4(已删除)

更新:

更新2:

这是完整的代码,它工作得非常完美(右键)不要忘记将图像包含在同一个包中,并且图像类型相同

package aircraftPackage;

import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.Image;
import java.awt.MediaTracker;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;

public class RotateImage extends JFrame implements KeyListener {
    private static final long serialVersionUID = 1L;
    private static Image TestImage;
    private static RotateImage ri;
    private BufferedImage bf;
    private int cordX = 100;
    private int cordY = 100;
    private double currentAngle;

    public RotateImage(Image TestImage) {
     this.TestImage = TestImage;
     MediaTracker mt = new MediaTracker(this);
     mt.addImage(TestImage, 0);
     try {
       mt.waitForID(0);
     }
     catch (Exception e) {
       e.printStackTrace();
     }
        setTitle("Testing....");
        setSize(500, 500);
        imageLoader();
        setVisible(true);
    }
public void rotate() {
     //rotate 5 degrees at a time
     currentAngle+=5.0;
     if (currentAngle >= 360.0) {
       currentAngle = 0;
     }
     repaint();
   }


    public void imageLoader() {
        try {
            String testPath = "test.png";
            TestImage = ImageIO.read(getClass().getResourceAsStream(testPath));

        } catch (IOException ex) {
            ex.printStackTrace();
        }

        addKeyListener(this);
    }

    public void update(Graphics g){
           paint(g);
    }

    public void paint(Graphics g){

        bf = new BufferedImage( this.getWidth(),this.getHeight(), BufferedImage.TYPE_INT_RGB);

    try{
    animation(bf.getGraphics());
    g.drawImage(bf,0,0,null);
    }catch(Exception ex){

    }
}

    public void animation(Graphics g) {
        super.paint(g);
        Graphics2D g2d = (Graphics2D)g;
        AffineTransform origXform = g2d.getTransform();
        AffineTransform newXform = (AffineTransform)(origXform.clone());
        //center of rotation is center of the panel
        int xRot = this.getWidth()/2;
        int yRot = this.getHeight()/2;
        newXform.rotate(Math.toRadians(currentAngle), xRot, yRot);
        g2d.setTransform(newXform);
        //draw image centered in panel
        int x = (getWidth() - TestImage.getWidth(this))/2;
        int y = (getHeight() - TestImage.getHeight(this))/2;
        g2d.drawImage(TestImage, x, y, this);
        g2d.setTransform(origXform);
        g.drawImage(TestImage, cordX, cordY, this);
    }

    public static void main(String[] args) {
         ri = new RotateImage(TestImage);

    }

    public void keyPressed(KeyEvent ke) {

        switch (ke.getKeyCode()) {
        case KeyEvent.VK_RIGHT: {
            cordX += 5;

           ri.rotate();
        }
            break;
        case KeyEvent.VK_LEFT: {
            cordX -= 5;
            ri.rotate();
        }
            break;
        case KeyEvent.VK_DOWN: {
            cordY += 5;
            ri.rotate();
        }
            break;
        case KeyEvent.VK_UP: {
            cordY -= 3;
            ri.rotate();
        }
            break;
        }
        repaint();
    }

    public void keyTyped(KeyEvent ke) {
    }

    public void keyReleased(KeyEvent ke) {
    }
}
似乎每次都在旋转同一个图像,因此它将始终仅旋转5度

编辑:哼,太晚了。见shareef post

似乎每次都在旋转同一个图像,因此它将始终仅旋转5度


编辑:哼,太晚了。请参阅shareef post。

这正是我在发布此问题之前想要做的!!我还在尝试。如果我将“final RotateImage ri=new RotateImage(TestImage);”放在构造函数中,我会得到一个“java.lang.StackOverflowerError”。我希望它能工作,因为我缺少运行它的类;)谢谢你的帮助。我试过上面提到的东西。但它是一样的,图像只旋转一次。如果你提供了所有的源代码,我可以帮你,但我想问一下,你创建了这些类吗?你说的是哪些类?不,我没有完全创建这些类。哪些课程缺失?这正是我在发布这个问题之前想做的!!我还在尝试。如果我将“final RotateImage ri=new RotateImage(TestImage);”放在构造函数中,我会得到一个“java.lang.StackOverflowerError”。我希望它能工作,因为我缺少运行它的类;)谢谢你的帮助。我试过上面提到的东西。但它是一样的,图像只旋转一次。如果你提供了所有的源代码,我可以帮你,但我想问一下,你创建了这些类吗?你说的是哪些类?不,我没有完全创建这些类。缺了哪些课?