Для изображений вы должны использовать drawImage метод Graphics2D с относительным AffineTransform .
Для фигуры вы можете вращать само Graphics2D:
public void paintComponent(Graphics g)
{
super.paintComponent(g);
Graphics2D g2d = (Graphics2D)g;
g2d.setColor(Color.WHITE);
Rectangle rect2 = new Rectangle(100, 100, 20, 20);
g2d.rotate(Math.toRadians(45));
g2d.draw(rect2);
g2d.fill(rect2);
}
И, кстати, вы должны переопределить метод paintComponent вместо рисования.
Цитирование JComponent API:
Вызывается Swing для рисования компонентов.Приложения не должны вызывать рисование напрямую, а вместо этого должны использовать метод repaint, чтобы запланировать перерисовку компонента.
Этот метод фактически делегирует работу рисования трем защищенным методам: paintComponent, paintBorder и paintChildren.Они вызываются в указанном порядке, чтобы гарантировать, что дочерние элементы появляются поверх самого компонента.Вообще говоря, компонент и его дочерние элементы не должны рисовать в области вставок, выделенных для границы.Подклассы могут просто переопределить этот метод, как всегда.Подкласс, который просто хочет специализировать метод рисования делегата UI (внешний вид), должен просто переопределить paintComponent.
Помните также, что когда вы выполняете аффинное преобразование, такое как вращение, объект неявно поворачиваетсявокруг оси происхождения.Поэтому, если вы намереваетесь повернуть его вокруг произвольной точки, вам следует перед тем, как перевести его обратно в начало координат, повернуть его, а затем перенести его в нужную точку.