我需要一些声音类的解释。所以我创建了一个Sound
对象类,允许我稍后调用我需要的任何声音。我的文件位于与{j}文件相同的目录中的sounds
文件夹中。所以它~\Game\sounds\music.wav
现在每次我通过创建一个对象然后调用它来从主类执行这个代码时,它给我文件不存在,我是否正确地指向文件?目前我的fileName
仅为"music.wav"
我怎么能在不对目录进行硬编码的情况下将其指向sounds
目录,以便它可以在任何cpu上运行。
public Sound(String fileName) {
try {
File file = new File(fileName);
if (file.exists()) {
myClip = (AudioClip) Applet.newAudioClip(file.toURI().toURL());
} else {
throw new RuntimeException("Sound: file not found: " + fileName);
}
} catch (MalformedURLException e) {
throw new RuntimeException("Sound: malformed URL: " + e);
}
}
public void play() {
myClip.play();
}
答案 0 :(得分:1)
我希望这段代码可以帮到你。我在名为 resources 的 src 下创建了包。在资源包下,我放了所有声音文件。
import java.io.*;
import java.net.URL;
import javax.sound.sampled.*;
public enum SoundEffect {
BUSY("resources/phone-busy.wav"),
CALLING("resources/phone-calling.wav"),
DISCONNECT("resources/phone-disconnect.wav"),
RING("resources/telephone-ring.wav");
// Each sound effect has its own clip, loaded with its own sound file.
private Clip clip;
private URL url;
private AudioInputStream audioInputStream;
// Constructor to construct each element of the enum with its own sound file.
SoundEffect(String soundFileName) {
try {
// Use URL (instead of File) to read from disk and JAR.
this.url = this.getClass().getClassLoader().getResource(soundFileName);
// Set up an audio input stream piped from the sound file.
this.audioInputStream = AudioSystem.getAudioInputStream(url);
// Get a clip resource.
clip = AudioSystem.getClip();
// Open audio clip and load samples from the audio input stream.
clip.open(audioInputStream);
} catch (UnsupportedAudioFileException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (LineUnavailableException e) {
e.printStackTrace();
}
}
// Play or Re-play the sound effect from the beginning, by rewinding.
public void play() {
clip.loop(Clip.LOOP_CONTINUOUSLY);
}
public void stop(){
clip.stop(); // Stop the player if it is still running
clip.flush();
clip.setFramePosition(0);
}
// Optional static method to pre-load all the sound files.
static void init() {
values(); // calls the constructor for all the elements
}
public boolean isActive(){
return clip.isActive();
}
public boolean isOpen() {
return clip.isOpen();
}
public void setFramePosition() {
clip.setFramePosition(0);
}
}
此类用于测试Swing应用程序中的SoundEffect枚举
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
// Testing the SoundEffect enum in a Swing application
@SuppressWarnings("serial")
public class SoundEffectDemo extends JFrame {
// Constructor
public SoundEffectDemo() {
// Pre-load all the sound files
// Set up UI components
Container cp = this.getContentPane();
cp.setLayout(new FlowLayout(FlowLayout.CENTER, 10, 10));
JButton btnSound1 = new JButton("CALLING");
btnSound1.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SoundEffect.CALLING.play();
}
});
cp.add(btnSound1);
JButton btnSound2 = new JButton("RING");
btnSound2.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SoundEffect.RING.play();
}
});
cp.add(btnSound2);
JButton btnSound3 = new JButton("BUSY");
btnSound3.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
SoundEffect.BUSY.play();
}
});
cp.add(btnSound3);
JButton btnSound4 = new JButton("Stop Sound ");
btnSound4.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
for(SoundEffect value : SoundEffect.values()){
if(value.isActive()){
value.stop();
}
}
}
});
cp.add(btnSound4);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setTitle("Test SoundEffct");
this.pack();
this.setVisible(true);
}
public static void main(String[] args) {
new SoundEffectDemo();
}
}