Rotando una imagen a través de java.awt.geom.AffineTransform
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:

Fuente: http://lefunes.wordpress.com/2008/05/30/rotando-una-imagen-a-traves-de-javaawtgeomaffinetransform/