2014-04-23 75 views
0

我需要一些有聲級別的解釋。所以我製作了一個Sound對象類,以便稍後調用我需要的任何聲音。我將文件放在與java文件相同的目錄中的sounds文件夾中。所以這是~\Game\sounds\music.wav現在每次我通過創建一個對象然後調用它從主類執行此代碼,它給我的文件不存在,我指向錯誤的文件?目前我的fileName只是"music.wav"我怎麼能指向sounds目錄,而不用硬編碼目錄,因此它可以在任何cpu上工作。java目錄中的循環聲音

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

回答

1

我希望這段代碼能幫到你。我創建了一個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應用程序

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(); 
    } 
} 
測試SoundEffect中枚舉