2012-03-14 2 views
0

Dans mon application, j'ai ajouté de la musique à ma maison JFrame. Maintenant, quand je le lance sur ma main il n'y a pas de problème, il ouvre le Home JFrame et en même temps la musique joue.Jouer de la musique en même temps avec mon JFrame

import Muziek.Sound; 
import View.Home; 

public class Main { 


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

    } 
} 

Mais maintenant, quand je lance ma classe d'accueil JFrame devient blanc tandis que la musique joue et quand la musique que je soit possible cesse de voir mon JFrame. Maintenant, j'ai lu quelque chose à propos de thread afin que vous puissiez l'exécuter en même temps, mais je ne sais pas comment faire.

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

Ma musique de classe

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

Utilisez un 'Clip' comme indiqué [ici] (http://stackoverflow.com/a/9656682/418556) (ce code joue 2 clips au en même temps - woo-hoo!). –

Répondre

1

Je ne travaillais pas avec Clip s avant, mais vous devriez jouer la musique sur un thread séparé, que vous ne devez pas effectuer de longues tâches en cours d'exécution sur le thread d'interface utilisateur (il gèle l'interface utilisateur comme vous pouvez le voir):

public void run() 
{ 

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

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