// This code example is from the following source:
//
// Book Title: Programming with Objects, A Comparative Presentation
// of Object-Oriented Programming with C++ and Java
//
// Chapter: Chapter 17 OO For Graphical User Interfaces, A Tour Of Three Toolkits
//
// Section: Section 17.19 Drawing Shapes, Text, And Images In AWT/SwingR4
//
// The links to the rest of the code in this book are at
//
// http://programming-with-objects.com/pwocode.html
//
// For further information regarding the book, please visit
//
// http://programming-with-objects.com
//
//RotatingRect.java
import javax.swing.*;
import java.awt.*;
import java.awt.event.*;
public class RotatingRect {
public static void main(String[] args) {
JFrame f = new JFrame("Rotating Rectangle");
f.addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
System.exit(0);
}
});
Container container = f.getContentPane();
container.add( new RotatingRectPanel() );
f.setLocation( 300, 300 );
f.pack();
f.setVisible(true);
}
}
class RotatingRectPanel extends JPanel {
Graphics2D g2d;
Point point = null; // point in window clicked on
Dimension preferredSize = new Dimension(300, 300);
//width and height of the rotating yellow square:
int rectWidth = 60;
int rectHeight = 60;
//the following two data members needed for computing
//rotation angles around the center of the square:
int halfWindowWidth = preferredSize.width / 2;
int halfWindowHeight = preferredSize.height / 2;
//theta is desired orientation of the square
//thetaPrevious is current orientation of the square
double theta = 0.0; //(J)
double thetaPrevious = 0.0; //(K)
//constructor:
public RotatingRectPanel( ) {
addMouseListener(new MouseAdapter() { //(L)
public void mousePressed(MouseEvent e) { //(M)
//coordinates of the pointed clicked on:
int x = e.getX(); //(N)
int y = e.getY(); //(O)
if (point == null) {
point = new Point(x, y);
} else {
point.x = x;
point.y = y;
}
repaint();
}
});
}
//important for panel sizing:
public Dimension getPreferredSize() {
return preferredSize;
}
public void paintComponent(Graphics g) {
super.paintComponent(g); //paint background
int xFromCenter = 0;
int yFromCenter = 0;
int rectOriginX = halfWindowWidth - rectWidth / 2;
int rectOriginY = halfWindowHeight - rectHeight / 2;
g2d = (Graphics2D) g;
if ( point != null ) {
xFromCenter = point.x - halfWindowWidth;
yFromCenter = point.y - halfWindowHeight;
theta = Math.atan2( (double) yFromCenter,
(double) xFromCenter ) + Math.PI/4.0;
}
g2d.translate( halfWindowWidth, halfWindowHeight ); //(P)
g2d.rotate( theta - thetaPrevious ); //(Q)
g2d.translate( - halfWindowWidth, - halfWindowHeight ); //(R)
g2d.setColor(Color.yellow);
g2d.fillRect(rectOriginX, rectOriginY, rectWidth, rectHeight);
thetaPrevious = theta;
}
}