首先,这里有一些代码段:问题与Java join()方法
public void startThread() {
this.animationThread = new Thread(this);
this.animationThread.start();
try {
this.animationThread.join();
} catch (InterruptedException e) {
e.printStackTrace();
}
}
@Override
public void run() {
pirateMainAnimation.animate();
}
public void animate() {
for (int j = 0; j < 9; j++) {
try {
Thread.sleep(250);
} catch (InterruptedException e) {
break;
}
PirateAnimationPanel.getInstance().setCurrent(j);
PirateAnimationPanel.getInstance().repaint();
}
}
我试图动画一些图片。问题是我想要主线程等待动画线程完成并继续。我搜索了一下,读了一下,然后决定使用join()方法。它完美地等待线程完成,但我没有正确动画。 repaint()方法被调用2次而不是9次。我想也许问题是因为我使用了单身人士。这是单例实现。
import java.awt.Graphics;
import java.awt.MediaTracker;
import javax.swing.JPanel;
import uk.ac.aber.dcs.piratehangman.animation.PirateMainAnimation;
import uk.ac.aber.dcs.piratehangman.utilityclasses.AnimationThread;
@SuppressWarnings("serial")
public class PirateAnimationPanel extends JPanel {
private int current;
private MediaTracker mTracker;
private PirateMainAnimation pirateMainAnimation;
private AnimationThread animationThread;
private PirateAnimationPanel() {
this.current = 0;
this.pirateMainAnimation = new PirateMainAnimation();
mTracker = new MediaTracker(this);
this.animationThread = new AnimationThread();
setMediaTracker();
repaint();
}
private void setMediaTracker() {
for (int i = 0; i < 9; i++) {
mTracker.addImage(
this.pirateMainAnimation.getImagesForAnimation()[i],
this.pirateMainAnimation.getImagesForAnimationID()[i]);
try {
mTracker.waitForID(this.pirateMainAnimation
.getImagesForAnimationID()[i]);
} catch (InterruptedException e) {
System.out.println("Error loading image: " + i);
}
}
}
public void playAnimation() {
this.animationThread.startThread();
}
public void paintComponent(Graphics g) {
super.paintComponents(g);
System.out.println("called");
g.drawImage(this.pirateMainAnimation.getImagesForAnimation()[current],
0, 0, this);
}
private static class PirateAnimationPanelHolder {
private static final PirateAnimationPanel pirateAnimationPanel =
new PirateAnimationPanel();
};
public static PirateAnimationPanel getInstance() {
return PirateAnimationPanelHolder.pirateAnimationPanel;
}
public void setCurrent(int current) {
this.current = current;
}
public int getCurrent() {
return current;
}
}
考虑发布的代码为你的问题的一部分,而不是托管在别的地方,如果你需要帮助让它正确格式化,只是这样说,我会很乐意为你编辑代码。 – 2010-05-06 03:38:41
我认为在这里发布只会妨碍问题的解决。无论如何,如果你对我这样做很好,我会很高兴,因为我从来没有在这里发布代码。谢谢 :)。 – gmunk 2010-05-06 03:41:19
当然,要在SO上格式化代码,只需在每行前面缩进四个空格即可。我将在代码中进行编辑,如果您之后点击编辑,则可以看到我的意思。并且欢迎来到StackOverflow btw :)另外,我注意到你在你的文本中使用了TAB,这也必须被编辑出来并用SO上的空格替换。无论如何,代码编辑英寸,并回答您的评论中隐含的问题,不,这里的代码将不会妨碍问题的方式,只要它的大小,代码将脱颖而出,因为你可以看到,所以它是很容易看到什么是代码和什么是问题。 – 2010-05-06 03:42:03