在Java应用程序中,如何在绘制函数中输出音频?我试过这段代码:
public static void Player(String audioname){ //For audio
InputStream in = null;
try{
in = new FileInputStream (new File (audioname));
}
catch (FileNotFoundException e){
System.err.print("Audio file not found!");
}
try{
as = new AudioStream (in);
}
catch (IOException e){
System.err.print("AudioStream couldn't be created!");
}
}
////////////////////////////////////////////////////////////////
try{
Player(name);
AudioPlayer.player.start(as);
} catch(Exception f){
System.err.print("Audio couldn't be played!");
}
...然而,玩家会在Exception f catch语句中被捕获。我也尝试将它放在一个不同的地方(作为一个单独的方法,油漆调用,但它仍然无法工作。任何帮助?
编辑:
class playAudio implements Runnable{
public void run(){
try{
Player("countdown.wav");
AudioPlayer.player.start(as);
} catch(Exception f){
System.err.print("Audio couldn't be played!");
}
}
}
///////////////////////////////////////
public void paint(Graphics g){ //Draw function
Graphics2D g2d = (Graphics2D) g;
///////////////////////////////////
Thread audioThrd = new Thread(new playAudio());
audioThrd.start();
}
在这里,我添加了一个播放音频文件的线程,但“音频无法播放!”还是表明。我在这里做错了什么?
答案 0 :(得分:3)
不,永远不要在油漆里面做声音。绘画方法仅用于绘图和绘图,应该非常快速。绘制方法越慢,程序对用户的响应越少。运行音频将创建一个长时间运行的进程,如果这是在paint方法中发生的,那么程序的GUI将停止运行,而不是你想要发生的事情。
相反,您希望在Swing事件线程的后台线程中播放音频。 SwingWorker可以很好地工作,但任何旧的花园种类线程都可以。
修改强>
关于这段代码:
public void paint(Graphics g){ //Draw function
Graphics2D g2d = (Graphics2D) g;
///////////////////////////////////
Thread audioThrd = new Thread(new playAudio());
audioThrd.start();
}
再次,不要这样做。请理解,您无法控制何时甚至 if * paint被调用,因为这是由JVM控制的。你可以建议通过调用repaint()
来调用它,但是这不能保证工作,特别是如果重绘请求“堆栈”。另请注意,JVM可以在您不请求时调用paint,例如当操作系统通知它的某个窗口是“脏”并需要重新绘制时。
所以底线是:
至于为什么你的代码没有播放音乐,你有没有实现我的printStackTrace()推荐?
接下来,我们将讨论为什么不应该在paint(Graphics g)
内绘图,而应该在JComponent的paintComponent(Graphics g)
方法中进行绘图。