【发布时间】:2019-04-26 00:11:47
【问题描述】:
我一直在尝试使用 Java Swing Graphics 为角色制作动画。我从主屏幕过渡到 JPanel,它应该在音频(WAV 文件)运行时同时显示动画。然而,音频首先运行,然后 JPanel 被显示和动画化。
如何在我的代码中修复此错误,以便音频和动画同时发挥作用?
我知道我的 Thread.sleep() 函数有一个错误,它强制整个线程进入睡眠状态。但是,我无法弄清楚如何在没有 Thread.sleep() 的情况下运行我的音频,并且线程不会与 Thread.sleep() 方法同时运行。
我目前正在使用 Java 8。
音频类
import java.io.*;
import javax.sound.sampled.*;
public class AudioManager
{
static AudioInputStream audioInputStream = null;
static Clip curClip = null;
public static void playSound(String fileName)
{
System.out.println("Playing Sound");
new Thread(new Runnable()
{
public void run()
{
try
{
audioInputStream = AudioSystem.getAudioInputStream(new File(fileName));
curClip = AudioSystem.getClip();
curClip.open(audioInputStream); //Opens Stream
curClip.start();
Thread.sleep(curClip.getMicrosecondLength() / 1000); //Pauses the thread
audioInputStream.close();
curClip.close();
}
catch(Exception ex)
{
ex.printStackTrace();
}
}
}).run();
}
}
Animator 类调用音频方法
Timer t1 = new Timer(background_Intro_Speed, new ActionListener()
{
public void actionPerformed(ActionEvent e)
{
System.out.println(isShowing());
if(isShowing())
{
System.out.println(audioOver);
if(audioOver && animated.xPosition <= 905)
animated.xPosition += 5;
else if(animated.xPosition > 905 && audioOver)
{
System.out.println("Animation Ended");
swapPanel();
}
else if(!audioOver)
{
new Thread(new Runnable()
{
public void run()
{
System.out.println("In Thread");
AudioManager.playSound("foo.wav");
audioOver = true;
}
}).run();
}
}
}
});
t1.start();
【问题讨论】:
-
Thread.sleep(curClip.getMicrosecondLength() / 1000);- 没有必要这样做 - 您想知道剪辑何时完成,请改用LineListener。另外Clip使用它自己的线程来播放音频,所以不确定你需要更多线程
标签: java multithreading swing audio