Java Audio in paint功能

时间:2013-11-21 03:02:15

标签: java audio awt paint javasound

在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();
}

在这里,我添加了一个播放音频文件的线程,但“音频无法播放!”还是表明。我在这里做错了什么?

1 个答案:

答案 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)方法中进行绘图。