首页 >Java >java教程 >如何在Java Swing中使用定时器平滑地将图像旋转90度?

如何在Java Swing中使用定时器平滑地将图像旋转90度?

Patricia Arquette
Patricia Arquette原创
2024-12-07 17:11:15640浏览

How to Smoothly Rotate an Image 90 Degrees in Java Swing Using a Timer?

如何在 Swing 中逐渐旋转图像?

此问题涉及 Java Swing 中单击按钮时旋转图像的问题。目标是让图像平滑旋转到 90 度。

问题详细信息:

提供的代码包含几个类:RotateButtonSSCE、CrossingPanelSSCE、VisualizationPanelSSCE 和一个 main TestGUISSCE 中的方法。 RotateButtonSSCE 类创建一个触发旋转的按钮,CrossingPanelSSCE 类包含需要旋转的图像,VisualizationPanelSSCE 类提供用于绘制图像的表面。

尝试逐渐旋转图像时会出现此问题。该代码尝试使用计时器来调用增量旋转图像的方法来实现此目的,但它似乎没有按预期工作。

答案:

除了@tulskiy 建议的更正之外,还需要注意的是,给定的代码存在一些可能导致该问题的结构问题。以下是关键观察和建议:

  • 使用顶级或嵌套类: SSCCE(简短、自包含、正确(可编译)、示例)应该易于理解不需要创建多个公共类。为了方便起见,请考虑使用顶级(包私有)或嵌套类。
  • 在事件调度线程上构造 GUI: 始终在事件调度线程上创建 GUI 以避免线程问题。
  • 利用paintComponent方法:在这个例子中,CrossingPanelSSCE中的paintComponent()方法负责显示图像。要逐渐旋转图像,您可以使用 AffineTransform 类来更改图形上下文的变换。通过应用适当的旋转和平移,可以实现平滑的旋转效果。

修订的代码摘录:

这里是 CrossingPanelSSCE 类旋转的修订部分图像使用AffineTransform:

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;

import javax.swing.*;

public class CrossingPanelSSCE extends JPanel {

    // ... other code

    private BufferedImage image;
    private double rotationAngle = 0;
    private AffineTransform transform = new AffineTransform();

    // ... other methods

    @Override
    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        Graphics2D g2d = (Graphics2D) g;

        // Apply the rotation transform to the graphics context
        g2d.setTransform(transform);

        // Draw the image at its center
        g2d.drawImage(image, -image.getWidth() / 2, -image.getHeight() / 2, null);
    }

    public void rotateImage(double angle) {
        rotationAngle += angle;

        // Update the AffineTransform with the new rotation angle
        transform.rotate(Math.toRadians(angle), image.getWidth() / 2, image.getHeight() / 2);

        // Repaint the panel to display the updated image
        repaint();
    }
}

RotateButtonSSCE(按钮操作监听器)中的用法:

public void actionPerformed(ActionEvent ev) {
    vis.rotateImage(ROTATE_ANGLE_OFFSET);
}

此代码将每个按钮上的旋转角度增加一个小值 (ROTATE_ANGLE_OFFSET)单击 并相应地更新图像。您可以调整 ROTATE_ANGLE_OFFSET 来控制旋转动画的速度。

以上是如何在Java Swing中使用定时器平滑地将图像旋转90度?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn