java - 当我运行此代码时,它只是在播放音频时卡住。但是,我希望动画与音频同时运行。我怎样才能做到这一点?

标签 java multithreading swing audio

我一直在尝试使用 Java Swing Graphics 为角色制作动画。我从主屏幕转换到 JPanel,该 JPanel 应该在音频(WAV 文件)运行时同时显示动画。但是,首先运行音频,然后显示 JPanel 并进行动画处理。

如何修复代码中的此错误,以便音频和动画同时运行?

我知道我的 Thread.sleep() 函数存在错误,会强制整个线程 hibernate 。但是,我无法弄清楚如何在没有 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();

    }
}

调用音频方法的动画器类

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

最佳答案

}).run();

您的主题不是主题。您只是执行线程的 run() 方法。

代码应该是:

}).start();

启动一个单独的线程,以便代码不在事件调度线程上执行。

关于java - 当我运行此代码时,它只是在播放音频时卡住。但是,我希望动画与音频同时运行。我怎样才能做到这一点?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55859144/

相关文章:

java - 存储库和服务层之间的区别

c# - 需要帮助使用线程来监视指定文件夹中的 txt 文件

java - Android 应用程序跳帧,一段时间后崩溃

java - jscrollpane 不适用于 swing 应用程序中的 jtable

java - 如何延迟Java代码直到另一部分代码完成?

java - 我在使用 javamail + glassfish 4 发送电子邮件时遇到问题

java - 查找输入数组的多数元素的程序不起作用

java - 构建项目时“解析 java...”卡在 IntelliJ 中

java - 阅读文本字段时从一帧单击到另一帧

multithreading - Perl 中的线程 : order of detach()