Обычно, когда вы рисуете изображение, вы указываете верхнюю/левую координату для рисования изображения. Однако по мере поворота не прямоугольного изображения размер изображения будет изменяться, и поэтому местоположение x/y изменится.
Так что вам нужно подумать о повороте изображения о его центральной точке. Поэтому для каждого поворота необходимо пересчитать местоположение x/y относительно центра.
В приведенном ниже примере изображения будет поворачиваться вокруг точки (300, 300):
import java.awt.*;
import java.awt.geom.AffineTransform;
import java.awt.image.BufferedImage;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.event.*;
public class Rotation3 extends JPanel
{
private Icon icon;
private RotatedIcon rotated;
private int degrees;
public Rotation3(Image image)
{
icon = new ImageIcon(image);
rotated = new RotatedIcon(icon, 0);
// rotated.setCircularIcon(true);
setDegrees(0);
setPreferredSize(new Dimension(600, 600));
}
@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
// translate x/y so Icon rotated around a specific point (300, 300)
int x = 300 - (rotated.getIconWidth()/2);
int y = 300 - (rotated.getIconHeight()/2);
rotated.paintIcon(this, g, x, y);
g.setColor(Color.RED);
g.fillOval(295, 295, 10, 10);
}
public void setDegrees(int degrees)
{
this.degrees = degrees;
rotated.setDegrees(degrees);
repaint();
}
public static void main(String[] args)
{
EventQueue.invokeLater(new Runnable()
{
public void run()
{
try
{
// String path = "dukewavered.gif";
String path = "lunch75.jpg";
ClassLoader cl = Rotation3.class.getClassLoader();
BufferedImage bi = ImageIO.read(Rotation3.class.getResourceAsStream(path));
final Rotation3 r = new Rotation3(bi);
final JSlider slider = new JSlider(JSlider.HORIZONTAL, 0, 360, 0);
slider.addChangeListener(new ChangeListener()
{
public void stateChanged(ChangeEvent e)
{
int value = slider.getValue();
r.setDegrees(value);
}
});
JFrame f = new JFrame();
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.add(new JScrollPane(r));
f.add(slider, BorderLayout.SOUTH);
f.pack();
f.setLocationRelativeTo(null);
f.setVisible(true);
}
catch(IOException e)
{
System.out.println(e);
}
}
});
}
}
Примечание:
В этом примере используется Rotated Icon класса, так как этот класс управляет изменяющимися размерами изображение при его повороте.
Кроме того, если вы используете «круговой» значок, вы можете использовать setCircularIcon(true)
, и размер не будет пересчитан, поэтому вы можете указать значения x/y как верхние/левые.
Возможно, вам необходимо установить опорную точку, вокруг которой изображение можно вращать – MadProgrammer