2012-03-14 5 views
0

내 앱에서 JFrame 홈에 음악을 추가했습니다. 이제는 내 메인에서 실행했을 때 홈 JFrame을 열고 음악이 재생되는 동안 문제가 없습니다.내 JFrame과 동시에 음악 재생

import Muziek.Sound; 
import View.Home; 

public class Main { 


    public static void main(String[] args) { 
    Home home = new Home(); 
    home.setVisible(true); 

    } 
} 

하지만 난 내 홈 클래스를 실행할 때 음악이 재생되고 음악이 멈출 때 난 내 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.awt.event.ActionListener; 
import java.io.File; 


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

import javax.swing.JPanel; 

import Controller.HomeController; 
import Muziek.Sound; 





public class Home extends JFrame { 

    private JLabel label, label1, label2; 
    private JPanel panel; 
    private JButton logo, logo1, logo2, logo3, logo4, logo5, selectie; 
    private Container window = getContentPane(); 
    private HomeController Controller; 

    public Home(){ 
     initGUI(); 
     Sound sound = new Sound(); 
     sound.play(); 
    } 
    public void addHomeListener(ActionListener a){ 
     selectie.addActionListener(a); 
    } 
    public void initGUI(){ 
     setLayout(null); 
     setTitle(""); 
     setPreferredSize(new Dimension(800,600)); 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 


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

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

     label2 = new JLabel(); 
     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, 150, 188, 188); 
     label1.add(logo); 

     logo1 = new JButton(new ImageIcon("../Ajax/src/img/Ster.png")); 
     logo1.setBorderPainted(false); 
     logo1.setBounds(10, 50, 82, 82); 
     label1.add(logo1); 

     logo2 = new JButton(new ImageIcon("../Ajax/src/img/Ster.png")); 
     logo2.setBorderPainted(false); 
     logo2.setBounds(92, 20, 82, 82); 
     label1.add(logo2); 

     logo3 = new JButton(new ImageIcon("../Ajax/src/img/Ster.png")); 
     logo3.setBorderPainted(false); 
     logo3.setBounds(174, 50, 82, 82); 
     label1.add(logo3); 

     logo4 = new JButton(new ImageIcon("../Ajax/src/img/shirt.png")); 
     logo4.setBorderPainted(false); 
     logo4.setBounds(50, 50, 135, 182); 
     label.add(logo4); 

     logo5 = new JButton(new ImageIcon("../Ajax/src/img/uitshirt.png")); 
     logo5.setBorderPainted(false); 
     logo5.setBounds(65, 50, 138, 190); 
     label2.add(logo5); 

     selectie = new JButton("Selectie"); 
     selectie.setBounds(60, 500, 99, 25); 
     selectie.setActionCommand("selectie"); 
     label.add(selectie); 

     pack(); 

      Controller = new HomeController(this); 
      addHomeListener(Controller); 

      setVisible(true); 
     } 

    public static void main(String... args) 
    { 
     javax.swing.SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       new Home(); 
      } 
     }); 
    } 
} 

내 수준의 음악

package Muziek; 

import java.io.File; 
import java.io.IOException; 
import javax.sound.sampled.AudioFormat; 
import javax.sound.sampled.AudioInputStream; 
import javax.sound.sampled.AudioSystem; 
import javax.sound.sampled.Clip; 
import javax.sound.sampled.DataLine; 
import javax.sound.sampled.LineUnavailableException; 
import javax.sound.sampled.UnsupportedAudioFileException; 
import javax.swing.JOptionPane; 

public class Sound implements Runnable { 


private File soundFile; 
private Clip clip; 
private Runnable play; 

public Sound(File soundFile){ 
this.soundFile = soundFile; 
} 

public Sound() { 
    soundFile = new File("../Ajax/src/sound/Sound1.wav"); 
    new Thread(play).start(); 

} 

public void prepare(){ 

try { 
AudioInputStream soundIn = AudioSystem.getAudioInputStream(soundFile); 
AudioFormat format = new AudioFormat(AudioFormat.Encoding.PCM_SIGNED, 
AudioSystem.NOT_SPECIFIED, 
16,2,4, 
AudioSystem.NOT_SPECIFIED, true); 
DataLine.Info info = new DataLine.Info(Clip.class, format); 

clip = (Clip)AudioSystem.getLine(info); 
clip.open(soundIn); 

}catch(IOException e){ 
JOptionPane.showMessageDialog(null, e.getMessage()); 
} 
catch(UnsupportedAudioFileException e){ 
JOptionPane.showMessageDialog(null, e.getMessage()); 
} 
catch(LineUnavailableException e){ 
JOptionPane.showMessageDialog(null, e.getMessage()); 
} 

} 

public void run() 
{ 

} 

public void play(){ 
prepare(); 
clip.start(); 
while(clip.isRunning()){ 
Thread.yield(); 
} 

} 
public void stop(){ 
clip.stop(); 
} 
} 
+0

는'Clip'를 사용하여 [여기] (http://stackoverflow.com/a/9656682/418556) (즉 코드에서이 개 클립을 재생 같은 시간 - 우 - 후!). –

답변

1

내가 Clip의 이전과 함께 작동하지 않았다,하지만 당신은 UI 스레드에서 장기 실행 작업을 수행해서는 안대로, 별도의 스레드에서 음악을 재생한다 (당신이 볼 수는 UI를 정지) : 그림과 같이

public void run() 
{ 

    prepare(); 
    clip.start(); 
    // ... 
} 

public void play(){ 
    new Thread(this).start(); 
}