2012-03-06 4 views
0

배경 음악으로 응용 프로그램을 제작하고 있습니다. 음악을 재생하기 위해 수업을 작성했으며 실행하면 재생이 시작됩니다. 또한 JFrame보기 클래스를 작성했습니다.내 메인 화면에서 음악 재생

이제 JFrame을 열면 다른 클래스의 음악이 재생되기를 바랍니다.

어떻게하면됩니까? 내보기 클래스

코드 : 내 사운드 클래스

package View; 

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Container; 
import java.awt.Dimension; 
import java.awt.Toolkit; 
import java.io.File; 


import javax.swing.Icon; 
import javax.swing.ImageIcon; 
import javax.swing.JButton; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 

import javax.swing.JPanel; 

import music.PlaySound; 

public class Home extends JFrame { 

    private JLabel label, label1, label2; 
    private JPanel panel; 
    private JButton logo; 
    private Container window = getContentPane(); 

    public Home(){ 
     initGUI(); 
    } 

    public void initGUI(){ 
     setLayout(null); 
     setTitle("Ismail"); 
     setPreferredSize(new Dimension(800,600)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     label = new JLabel("AFCA");  
     label.setBounds(0, 0, 266, 800); 
     label.setBackground(Color.WHITE); 
     label.setOpaque(true); 
     window.add(label); 

     label1 = new JLabel("AFCA1"); 
     label1.setBounds(267, 0, 266, 800); 
     label1.setBackground(Color.RED); 
     label1.setOpaque(true); 
     window.add(label1); 

     label2 = new JLabel("AFCA2"); 
     label2.setBounds(533, 0, 266, 800); 
     label2.setBackground(Color.WHITE); 
     label2.setOpaque(true); 
     window.add(label2); 

     logo = new JButton(new ImageIcon("../Ajax/src/img/logotje.gif")); 
     logo.setBorderPainted(false); 
     logo.setBounds(40, 100, 188, 188); 
     label1.add(logo); 

     pack(); 
    } 

} 

코드 : 당신이 당신의 JFrame의에있는 WindowListener를 추가 할 필요가 같은

package music; 

import java.io.*; 
import javax.sound.sampled.*; 

public class PlaySound 
{ 
    public static void main(String[] args) 
    { 
     sound = new File("../Ajax/src/sound/Sound.wav"); // Write you own file location here and be aware that it needs to be an .wav file 

     new Thread(play).start(); 
    } 

    static File sound; 
    static boolean muted = false; // This should explain itself 
    static float volume = 100.0f; // This is the volume that goes from 0 to 100 
    static float pan = 0.0f; // The balance between the speakers 0 is both sides and it goes from -1 to 1 

    static double seconds = 0.0d; // The amount of seconds to wait before the sound starts playing 

    static boolean looped_forever = false; // It will keep looping forever if this is true 

    static int loop_times = 0; // Set the amount of extra times you want the sound to loop (you don't need to have looped_forever set to true) 
    static int loops_done = 0; // When the program is running this is counting the times the sound has looped so it knows when to stop 

    final static Runnable play = new Runnable() // This Thread/Runnabe is for playing the sound 
    { 
     public void run() 
     { 
      try 
      { 
       // Check if the audio file is a .wav file 
       if (sound.getName().toLowerCase().contains(".wav")) 
       { 
        AudioInputStream stream = AudioSystem.getAudioInputStream(sound); 

        AudioFormat format = stream.getFormat(); 

        if (format.getEncoding() != AudioFormat.Encoding.PCM_SIGNED) 
        { 
         format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
           format.getSampleRate(), 
           format.getSampleSizeInBits() * 2, 
           format.getChannels(), 
           format.getFrameSize() * 2, 
           format.getFrameRate(), 
           true); 

         stream = AudioSystem.getAudioInputStream(format, stream); 
        } 

        SourceDataLine.Info info = new DataLine.Info(
          SourceDataLine.class, 
          stream.getFormat(), 
          (int) (stream.getFrameLength() * format.getFrameSize())); 

        SourceDataLine line = (SourceDataLine) AudioSystem.getLine(info); 
        line.open(stream.getFormat()); 
        line.start(); 

        // Set Volume 
        FloatControl volume_control = (FloatControl) line.getControl(FloatControl.Type.MASTER_GAIN); 
        volume_control.setValue((float) (Math.log(volume/100.0f)/Math.log(10.0f) * 20.0f)); 

        // Mute 
        BooleanControl mute_control = (BooleanControl) line.getControl(BooleanControl.Type.MUTE); 
        mute_control.setValue(muted); 

        FloatControl pan_control = (FloatControl) line.getControl(FloatControl.Type.PAN); 
        pan_control.setValue(pan); 

        long last_update = System.currentTimeMillis(); 
        double since_last_update = (System.currentTimeMillis() - last_update)/1000.0d; 

        // Wait the amount of seconds set before continuing 
        while (since_last_update < seconds) 
        { 
         since_last_update = (System.currentTimeMillis() - last_update)/1000.0d; 
        } 

        System.out.println("Playing!"); 

        int num_read = 0; 
        byte[] buf = new byte[line.getBufferSize()]; 

        while ((num_read = stream.read(buf, 0, buf.length)) >= 0) 
        { 
         int offset = 0; 

         while (offset < num_read) 
         { 
          offset += line.write(buf, offset, num_read - offset); 
         } 
        } 

        line.drain(); 
        line.stop(); 

        if (looped_forever) 
        { 
         new Thread(play).start(); 
        } 
        else if (loops_done < loop_times) 
        { 
         loops_done++; 
         new Thread(play).start(); 
        } 
       } 
      } 
      catch (Exception ex) { ex.printStackTrace(); } 
     } 
    }; 
} 

답변

0

소리가 난다. 다음과 같은 내용 :

public Home() { 
    initGUI(); 
    this.addWindowListener(new WindowAdapter() { 
     @Override 
     public void windowOpened(WindowEvent e) { 
      PlaySound.sound = new File("../Ajax/src/sound/Sound.wav"); 
      soundThread = new Thread(PlaySound.play).start(); 
     } 
     //If you want the sound to stop you can just add another override, but you need to keep track of the sound thread 
     @Override 
     public void windowClosing(WindowEvent e) { 
      soundThread.interrupt(); 
     } 
    }); 
}