【问题标题】:When I run this code, it just freezes while the audio plays. However, I want an animation to run simultaneously with the audio. How can I do this?当我运行此代码时,它只是在播放音频时冻结。但是,我希望动画与音频同时运行。我怎样才能做到这一点?
【发布时间】: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


【解决方案1】:
}).run();

您的主题不是主题。您只是在执行 Thread 的 run() 方法。

代码应该是:

}).start();

启动一个单独的线程,这样代码就不会在事件调度线程上执行。

【讨论】:

  • 抱歉,没用。然而,MadProgrammer 的修复奏效了。
  • @AwesomeGuy,可能没有解决这个问题,但仍然展示了如何正确创建一个单独的线程。您需要使用 start() 方法来创建一个 Thread。
  • @camicker, start() 重复调用线程。我只需要它运行一次。
  • @AwesomeGuy 不,它没有。一个线程只能启动一次。如果它重复运行,那么您就是在重复调用代码。使用线程的目的是让代码在单独的线程上执行。如果你使用 run() 那么你只是在调用一个方法,而不是执行一个线程。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-03-11
  • 2021-07-08
  • 1970-01-01
  • 1970-01-01
  • 2016-05-10
  • 2017-08-30
相关资源
最近更新 更多