假设您正在扩展的东西中执行此操作JComponent
,您应该使用
bird.render(g2, this);
作为JComponent
工具ImageObserver
图像消失的问题不是问题,而是发生旋转的点,我相信这是上下文ImageObserver
的上/左角。Graphics
尝试使用Graphics2D#rotate(double, int, int)
which 将允许您指定旋转的原点(枢轴点)。
不要忘记重置您的翻译,因为它们会影响您提供后绘制的所有内容,并且可能会在后续的绘制周期中重新使用。
用简单的例子更新
这是一个基本示例,展示了rotate
.
首先,我只是使用Graphics#rotate(double)
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.Graphics;
import java.awt.Graphics2D;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.awt.image.BufferedImage;
import java.io.File;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;
import javax.swing.UIManager;
import javax.swing.UnsupportedLookAndFeelException;
public class RotateImage {
public static void main(String[] args) {
new RotateImage();
}
public RotateImage() {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
try {
UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
} catch (ClassNotFoundException | InstantiationException | IllegalAccessException | UnsupportedLookAndFeelException ex) {
}
JFrame frame = new JFrame("Testing");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.add(new TestPane());
frame.pack();
frame.setLocationRelativeTo(null);
frame.setVisible(true);
}
});
}
public class TestPane extends JPanel {
private BufferedImage img;
private double angel = 0d;
public TestPane() {
try {
img = ImageIO.read(...);
} catch (IOException ex) {
ex.printStackTrace();
}
Timer timer = new Timer(40, new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
angel += 5;
repaint();
}
});
timer.start();
}
@Override
public Dimension getPreferredSize() {
return new Dimension(200, 200);
}
@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
if (img != null) {
Graphics2D g2d = (Graphics2D) g.create();
g2d.rotate(Math.toRadians(angel));
int x = (getWidth() - img.getWidth()) / 2;
int y = (getHeight() - img.getHeight()) / 2;
g2d.drawImage(img, x, y, this);
g2d.dispose();
}
}
}
}
然后我替换g2d.rotate(Math.toRadians(angel));
为g2d.rotate(Math.toRadians(angel), getWidth() / 2, getHeight() / 2);
,它使用组件(或Graphics
上下文)的中心位置作为旋转将围绕其发生的锚点......
现在,因为您只想旋转图像,所以您需要计算围绕图像中心位置当前位置的锚点(假设您希望它围绕中间旋转)