Maison > Java > javaDidacticiel > Comment faire pivoter en douceur une image de 90 degrés dans Java Swing à l'aide d'une minuterie ?

Comment faire pivoter en douceur une image de 90 degrés dans Java Swing à l'aide d'une minuterie ?

Patricia Arquette
Libérer: 2024-12-07 17:11:15
original
640 Les gens l'ont consulté

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

Comment faire pivoter une image progressivement dans Swing ?

Cette question concerne un problème de rotation d'une image lorsqu'on clique sur un bouton dans Java Swing . L'objectif est de faire pivoter l'image en douceur jusqu'à 90 degrés.

Détails de la question :

Le code fourni contient plusieurs classes : RotateButtonSSCE, CrossingPanelSSCE, VisualizationPanelSSCE et une classe principale. méthode dans TestGUISSCE. La classe RotateButtonSSCE crée un bouton qui déclenche la rotation, la classe CrossingPanelSSCE inclut l'image qui doit être pivotée et la classe VisualizationPanelSSCE fournit une surface pour dessiner l'image.

Le problème se pose lorsque vous essayez de faire pivoter l'image progressivement. . Le code tente d'y parvenir à l'aide d'un minuteur qui appelle une méthode pour faire pivoter l'image de manière incrémentielle, mais cela ne semble pas fonctionner comme prévu.

Réponse :

En plus des corrections suggérées par @tulskiy, il est important de noter que le code donné présente certains problèmes structurels qui peuvent contribuer au problème. Voici les principales observations et recommandations :

  • Utilisez des classes de niveau supérieur ou imbriquées : Un SSCCE (Short, Self Contained, Correct (Compilable), Sample) doit être facile à comprendre sans nécessiter la création de plusieurs classes publiques. Pensez à utiliser des classes de niveau supérieur (privées au package) ou imbriquées pour plus de commodité.
  • Construisez une interface graphique sur le fil de répartition d'événement : Créez toujours votre interface graphique sur le fil de répartition d'événement pour éviter les problèmes de thread.
  • Utilisez la méthode paintComponent : Dans cet exemple, la méthode paintComponent() dans CrossingPanelSSCE est responsable de l’affichage de l’image. Pour faire pivoter l'image progressivement, vous pouvez utiliser la classe AffineTransform pour modifier la transformation du contexte graphique. En appliquant des rotations et des traductions appropriées, vous pouvez obtenir un effet de rotation fluide.

Extrait de code révisé :

Voici une partie révisée de la classe CrossingPanelSSCE qui effectue une rotation l'image en utilisant 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();
    }
}
Copier après la connexion

Utilisation dans RotateButtonSSCE (Button ActionListener) :

public void actionPerformed(ActionEvent ev) {
    vis.rotateImage(ROTATE_ANGLE_OFFSET);
}
Copier après la connexion

Ce code incrémente l'angle de rotation d'une petite valeur (ROTATE_ANGLE_OFFSET) à chaque clic de bouton et met à jour l'image en conséquence. Vous pouvez ajuster le ROTATE_ANGLE_OFFSET pour contrôler la vitesse de l'animation de rotation.

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

source:php.cn
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Derniers articles par auteur
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal