Mediante AffineTransform se puede rotar una imagen dibujada sobre un Graphics.
Esto se debe a que en realidad AffineTransform agrega una transformada al objeto Graphipcs.
Para rotar se pasa a una instancia de AffineTransform a través de rotate(), pasándole el ángulo en radianes y el centro de rotación. Luego esta instancia se asigna al objeto Graphics (debemos asignársela a Graphics2D en realidad)
AffineTransform at = new AffineTransform(); at.rotate(r, 100, 100); //se asigna el angulo y centro de rotacion ((Graphics2D) g).setTransform(at);
Ejemplo
Por ejemplo creamos un panel que muestra un cuadrado girado una determinada cantidad de grados llamada JPanelImagenGiratoria.java:
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.geom.AffineTransform;
public class JPanelImagenGiratoria extends javax.swing.JPanel {
private int grados = 0;
public int getGrados() {
return grados;
}
public void setGrados(int grados) {
this.grados = grados;
repaint();
}
@Override
public void paint(Graphics g) {
super.paint(g); //se borra el contenido anterior
double r = Math.toRadians(grados); //se convierte a radianes lo grados
AffineTransform at = new AffineTransform();
at.rotate(r, 100, 100); //se asigna el angulo y centro de rotacion
((Graphics2D) g).setTransform(at);
//se dibuja
g.setColor(Color.BLUE);
g.drawRect(50, 50, 100, 100);
}
}
y un frame para realizar la prueba del panel llamada PruebaPanel.java. Prestar atención al observador de cambios del JSlider agregado mediante addChangeListener():
import java.awt.BorderLayout;
import javax.swing.JFrame;
import javax.swing.JSlider;
public class PruebaPanel{
public static void main(String[] args) {
final JFrame jf = new JFrame("Prueba Imagen Giratoria");
jf.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
jf.setSize(200, 250);
final JPanelImagenGiratoria ig = new JPanelImagenGiratoria();
final JSlider js = new JSlider(0, 360);
js.addChangeListener(new javax.swing.event.ChangeListener() {
public void stateChanged(javax.swing.event.ChangeEvent evt) {
ig.setGrados(js.getValue());
}
});
js.setValue(0);
jf.setLayout(new BorderLayout());
jf.add(ig, BorderLayout.CENTER);
jf.add(js, BorderLayout.SOUTH);
jf.setLocationRelativeTo(null);
jf.setVisible(true);
}
}
Imágenes:


