【发布时间】:2015-03-04 08:48:51
【问题描述】:
我正在尝试像这样在 for 循环中简单地旋转图像:
class MyCanvas extends JComponent {
AffineTransform identity = new AffineTransform();
Image arrow;
Double angle = -180.0;
public void spin() {
angle += 10.0;
for(int i = 0; i < 10; i++) {
repaint();
System.out.println(i);
try {
Thread.sleep(1000);
} catch (InterruptedException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
public void paint(Graphics g) {
Graphics2D g2 = (Graphics2D) g;
arrow = Toolkit.getDefaultToolkit().getImage("red-arrow-right-th.png");
// Rotate + translate
AffineTransform trans = new AffineTransform();
trans.setTransform(identity);
trans.translate(getWidth()/2, getHeight()/2);
trans.rotate(Math.toRadians(angle));
System.out.println(trans);
g2.drawImage(arrow, trans, this);
g2.finalize();
}
}
但是,当我在 main 中运行 call spin() 时,它似乎只应用了一次旋转,同时仍能正确打印出循环。我忽略了什么?
【问题讨论】:
-
我建议使用 rotate 方法,该方法为您提供了设置旋转将围绕其进行的锚点的方法。我认为默认情况下旋转是平移点的顶部/位置...
-
1-不要覆盖paint,覆盖paintComponent; 2- 在执行任何自定义绘画之前调用 super.paint/Component; 3-永远不要对任何东西调用finalize,尤其是对不是你自己创建的对象。注意,Swing 不是线程安全的,你不应该调用任何可能阻塞事件调度线程的东西,考虑使用 Swing 定时器