为什么赢了';我的java程序即使使用.wav文件也不能添加声音吗?

为什么赢了';我的java程序即使使用.wav文件也不能添加声音吗?,java,audio,javasound,Java,Audio,Javasound,我正在制作一个程序,只是为了测试声音。为了做到这一点,我正在看一段视频,这里有一个链接。但是,当我运行它时,它会生成一个带有按钮的框架,但是按钮没有任何作用。有什么问题 package RefrenceCode; import sun.audio.AudioData; import sun.audio.AudioPlayer; import sun.audio.AudioStream; import sun.audio.ContinuousAudioDataStream; import j

我正在制作一个程序,只是为了测试声音。为了做到这一点,我正在看一段视频,这里有一个链接。但是,当我运行它时,它会生成一个带有按钮的框架,但是按钮没有任何作用。有什么问题

   package RefrenceCode;
import sun.audio.AudioData;
import sun.audio.AudioPlayer;
import sun.audio.AudioStream;
import sun.audio.ContinuousAudioDataStream;
import java.awt.event.ActionEvent;
import java.io.*;
import javax.swing.*;
import java.awt.event.ActionListener;

public class Sound {
    public static void main(String[] args) {
        JFrame frame = new JFrame();
        frame.setSize(200,200);
        JButton button = new JButton("Click me");
        frame.add(button);
        button.addActionListener(new AL());
        frame.show(true);
    }
    public static class AL implements ActionListener{
        public final void actionPerformed(ActionEvent e) {
            music();
        }}
    public static void music(){
        AudioPlayer BGP = AudioPlayer.player;
        AudioStream BGM;
        AudioData MD;
        ContinuousAudioDataStream loop = null;
        try {
            //InputStream test = new FileInputStream("C:\\ wiiMusic.wav");
            //BGM = new AudioStream(test);
            BGM = new AudioStream(new FileInputStream("wiiMusic.wav"));
            MD = BGM.getData();
            loop = new ContinuousAudioDataStream(MD);
        }catch(IOException error) {}
        BGP.start(loop);
    }
}

过时的教程似乎是一个日益严重的问题

我将OP评论解释为问以下问题:如何寻址和加载本地音频文件,即与java程序打包,而不是远程访问

安德鲁·汤普森(Andrew Thompson)在评论中提供的链接很有用,但它没有一个处理自包含音频文件的示例。我不知道如何编辑它以包含一个示例。无论出于何种原因,Oracle Sound Trail教程也同样存在缺陷

首先,创建
AudioInputStream
的URL表单通常是最好的:

AudioInputStream ais = AudioSystem.getAudioInputStream(url);
为什么??因为它具有定位打包在jar中的资源的附加功能,而文件系统不能

我认为访问自包含音频资源的最常见做法是使用,因为您确信该类将是您项目的一部分。然后,音频资源的地址作为此类地址的相对地址给出

例如,假设您的项目中有类“MySound”。如果音频文件位于同一文件夹或包中,则相对寻址方案如下所示:

URL beepURL = MySound.class.getResource("beep.wav");
如果音频文件位于MySound所在的子文件夹或子包中,例如“/audio”,则命令如下:

URL beepURL = MySound.class.getResource("audio/beep.wav");
    URL url = LoopSound.class.getResource("leftright.wav");
    Clip clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream( url );
    clip.open(ais);
用于指定相对地址的基本HTML规则应该有效。包括“.”等符号,用于寻址父文件夹或包

例如,如果您有一个名为res/audio的包,它与包含MySound的包相邻

URL beepURL = MySound.class.getResource("../res/audio/beep.wav");
上述示例的文件结构:

src/com.mydomainname.myproject/utils/MySound 
src/com.mydomainname.myproject/res/audio/beep.wav 
如果以“/”原样“/”beep.wav”开头url地址,则会应用不同的规则。文件将其称为“绝对”形式。我没有在自己的编码中使用它,所以我不会冒险用错误的方式解释它

对于以下内容,我们可以按如下方式编辑这些行:

URL beepURL = MySound.class.getResource("audio/beep.wav");
    URL url = LoopSound.class.getResource("leftright.wav");
    Clip clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream( url );
    clip.open(ais);

这假设leftright.wav与LoopSound位于同一软件包中。

过时的教程似乎是一个日益严重的问题

我将OP评论解释为问以下问题:如何寻址和加载本地音频文件,即与java程序打包,而不是远程访问

安德鲁·汤普森(Andrew Thompson)在评论中提供的链接很有用,但它没有一个处理自包含音频文件的示例。我不知道如何编辑它以包含一个示例。无论出于何种原因,Oracle Sound Trail教程也同样存在缺陷

首先,创建
AudioInputStream
的URL表单通常是最好的:

AudioInputStream ais = AudioSystem.getAudioInputStream(url);
为什么??因为它具有定位打包在jar中的资源的附加功能,而文件系统不能

我认为访问自包含音频资源的最常见做法是使用,因为您确信该类将是您项目的一部分。然后,音频资源的地址作为此类地址的相对地址给出

例如,假设您的项目中有类“MySound”。如果音频文件位于同一文件夹或包中,则相对寻址方案如下所示:

URL beepURL = MySound.class.getResource("beep.wav");
如果音频文件位于MySound所在的子文件夹或子包中,例如“/audio”,则命令如下:

URL beepURL = MySound.class.getResource("audio/beep.wav");
    URL url = LoopSound.class.getResource("leftright.wav");
    Clip clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream( url );
    clip.open(ais);
用于指定相对地址的基本HTML规则应该有效。包括“.”等符号,用于寻址父文件夹或包

例如,如果您有一个名为res/audio的包,它与包含MySound的包相邻

URL beepURL = MySound.class.getResource("../res/audio/beep.wav");
上述示例的文件结构:

src/com.mydomainname.myproject/utils/MySound 
src/com.mydomainname.myproject/res/audio/beep.wav 
如果以“/”原样“/”beep.wav”开头url地址,则会应用不同的规则。文件将其称为“绝对”形式。我没有在自己的编码中使用它,所以我不会冒险用错误的方式解释它

对于以下内容,我们可以按如下方式编辑这些行:

URL beepURL = MySound.class.getResource("audio/beep.wav");
    URL url = LoopSound.class.getResource("leftright.wav");
    Clip clip = AudioSystem.getClip();
    AudioInputStream ais = AudioSystem.getAudioInputStream( url );
    clip.open(ais);

这假设leftright.wav与LoopSound位于同一个包中。

1)
import sun.audio.ContinuousAudioDataStream不要使用
com.sun
层次结构下的类。显示了如何加载和播放
剪辑
。2)
catch(IOException错误){}
不要忽略异常!他们准确地告诉我们出了什么问题。除非实现日志记录,否则至少调用
Throwable.printStackTrace()
3)请学习常见的Java命名法(命名约定-例如
EachWordUpperCaseClass
firstWordLowerCaseMethod()
firstWordLowerCaseAttribute
,除非它是
大写常量
)始终如一地使用它(&U)。谢谢,我从未使用过try and catch,所以我不知道它是如何工作的,事实上,它确实显示了一个错误。命名约定只是从视频中,我通常遵循约定。最后,该文件被下载到我的电脑上,并从youtube链接转换而来。那么,在没有url的情况下,我如何使用clip呢?“……事实上,它确实显示了一个错误”。。错误是什么?始终复制/粘贴错误和异常输出!将其作为问题的一部分并使用代码格式。由于错误,我在try and catch中发现了错误,我告诉它如果出现错误,则打印错误,这就是我所说的“我告诉它打印错误”,然后在代码中显示问题。1)
import sun.audio.ContinuousAudioDataStream不要使用
com.sun
层次结构下的类。显示了如何加载和播放
剪辑
。2)
catch(IOException错误){}
不要忽略异常!他们准确地告诉我们出了什么问题。除非实现日志记录,否则至少调用
Throwable.printStackTrac