ホームページ > 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、およびメインのいくつかのクラスが含まれています。 TestGUISCE のメソッド。 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 での使用法 (ボタン ActionListener):

public void actionPerformed(ActionEvent ev) {
    vis.rotateImage(ROTATE_ANGLE_OFFSET);
}
ログイン後にコピー

このコードは、各ボタンの回転角度を小さい値 (ROTATE_ANGLE_OFFSET) ずつ増分します。をクリックすると、それに応じて画像が更新されます。 ROTATE_ANGLE_OFFSET を調整して、回転アニメーションの速度を制御できます。

以上がJava Swing でタイマーを使用して画像をスムーズに 90 度回転する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
著者別の最新記事
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート