我有一个简单的问题。我想在每一步中移动JPanel(在另一个JPanel中),所以它看起来像是连续移动('Number'是我的类扩展JPanel):
Number n = (Number)this.findComponentAt(x, y);
for(int pp= 0; pp<10; pp++){
try {
Thread.sleep(100);
} catch (InterruptedException e) {
e.printStackTrace();
}
n.setLocation(x-10*pp, y);
n.repaint();
}
Number的paintComponent方法是:
public void paintComponent(Graphics g){
super.paintComponent(g);
numIc.paintIcon(this, g, 0, 0);
}
然而,它并没有一步一步地移动,而是在10次延迟后突然移动到最终目的地!我搜索了问题,但没有找到有用的答案。
答案 0 :(得分:1)
阅读关于并发的Swing教程中的部分,以便了解Event Dispatch Thread。 Thread.sleep()方法导致EDT进入睡眠状态,因此GUI无法自行重绘。
使用Swing Timer来安排动画。请查看上面链接中的目录,您还可以在How to Use Swing Timers
找到一个部分。
另外,为什么要创建自定义组件来绘制图标?只需使用带有Icon的JLabel并将标签贴到绘画上。不要重新发明轮子。