首頁 > Java > java教程 > 如何在Java Swing中使用定時器平滑地將影像旋轉90度?

如何在Java Swing中使用定時器平滑地將影像旋轉90度?

Patricia Arquette
發布: 2024-12-07 17:11:15
原創
640 人瀏覽過

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中文網其他相關文章!

來源:php.cn
本網站聲明
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn
作者最新文章
熱門教學
更多>
最新下載
更多>
網站特效
網站源碼
網站素材
前端模板