Simultanéité en java

Simultanéité en java - Java - Programmation

Marsh Posté le 16-05-2015 à 18:01:48    

Bonjour tout le monde,
Je suis débutant en java et je dois réaliser un projet (line rider pour être précis)
Tout marchait plutôt bien avant que j'essaye de mettre de la musique d'arrière fond. J'ai un lecteur de musique java qui marche bien, seul soucis le programme s'arrête dès que la musique commence à jouer. Je pense que c'est un problème de simultanéité donc sans doute un Thread, mais je n'ai jamais utilisé cet outil et je suis un peu perdu,
Merci d'avance pour votre aide et tout vos conseils,
Je mets mon code et mon lecteur java :
 
package linerider2;
 
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.MouseAdapter;
import java.awt.event.MouseEvent;
import java.io.ByteArrayInputStream;
import java.io.File;
import java.io.InputStream;
 
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JMenu;
import javax.swing.JMenuBar;
import javax.swing.JMenuItem;
import javax.swing.JPanel;
import javax.swing.JToolBar;
import javax.swing.KeyStroke;
import javax.swing.SwingUtilities;
 
public class Fenetre extends JFrame {
//cette classe hérite de la classe JFrame, c'est à dire de tout ses attributs
 
//LES ATTRIBUTS DU MENU
private JMenuBar menuBar = new JMenuBar();
 
JMenu fichier = new JMenu("File" ), //onglet "File"
edition = new JMenu("Edit" ), //onglet "Edit"
epaisseur = new JMenu("Line Width" ), //sous-onglet "Line Width" de "Edit"
couleur = new JMenu("Line Color" ), //sous-onglet "Line Color" de "Edit"
action = new JMenu("Action" ), //onglet "Action"
image = new JMenu("Picture" ), //onglet "Picture"
musique = new JMenu("Music" ); //onglet "Music"
 
JMenuItem nouveau = new JMenuItem("New" ), //item de l'onglet "File"
quitter = new JMenuItem("Quit" ), //item de l'onglet "File"
 
fin = new JMenuItem("Small" ), //item du sous-onglet "Line Width" de "Edit"
moyen = new JMenuItem("Medium" ), //item du sous-onglet "Line Width" de "Edit"
epais = new JMenuItem("Large" ), //item du sous-onglet "Line Width" de "Edit"
 
jaune = new JMenuItem("Yellow" ), //item du sous-onglet "Line Color" de "Edit"
orange = new JMenuItem("Orange" ), //item du sous-onglet "Line Color" de "Edit"
rose = new JMenuItem("Pink" ), //item du sous-onglet "Line Color" de "Edit"
rouge = new JMenuItem("Red" ), //item du sous-onglet "Line Color" de "Edit"
bleu = new JMenuItem("Blue" ), //item du sous-onglet "Line Color" de "Edit"
cyan = new JMenuItem("Cyan" ), //item du sous-onglet "Line Color" de "Edit"
vert = new JMenuItem("Green" ), //item du sous-onglet "Line Color" de "Edit"
gris = new JMenuItem("Gray" ), //item du sous-onglet "Line Color" de "Edit"
noir = new JMenuItem("Black" ), //item du sous-onglet "Line Color" de "Edit"
 
gomme = new JMenuItem("Eraser" ), //item de l'onglet "Edit"
crayon = new JMenuItem("Pencil" ),
placement = new JMenuItem("Position" ),
 
depart = new JMenuItem("Play" ), //item de l'onglet "Action"
stop = new JMenuItem("Stop" ), //item de l'onglet "Action"
pause = new JMenuItem("Pause" ),
 
 
 
playa = new JMenuItem("Vamos a la playa" ), //item de l'onglet "Music"
skibronze = new JMenuItem("Les Bronzés font du ski" ), //item de l'onglet "Music"
pharaon = new JMenuItem("Egypt" ), //item de l'onglet "Music" //à trouver
inca = new JMenuItem("Mayas" ), //item de l'onglet "Music" //à trouver
elysee = new JMenuItem("Aux Champs-Elysées" ), //item de l'onglet "Music"
ny = new JMenuItem("New York" ), //item de l'onglet "Music" //à trouver
ld = new JMenuItem("London" ), //item de l'onglet "Music" //à trouver
syd = new JMenuItem("Sydney" ), //item de l'onglet "Music" //à trouver
mika = new JMenuItem("Relax" ); //item de l'onglet "Music"
 
//LES ATTRIBUTS DE LA BARRE D'OUTILS
JToolBar toolBar = new JToolBar();
 
JButton small = new JButton(new ImageIcon("ImageIcone/images-fin.png" )), //icône trait fin
medium = new JButton(new ImageIcon("ImageIcone/images-epais.png" )), //icône trait moyen
large = new JButton(new ImageIcon("ImageIcone/images-large.png" )), //icône trait épais
 
yellow = new JButton(new ImageIcon("ImageIcone/images-jaune.png" )), //icône trait jaune
orange2 = new JButton(new ImageIcon("ImageIcone/images-orange.png" )), //icône trait orange
pink = new JButton(new ImageIcon("ImageIcone/images-rose.png" )), //icône trait rose
red = new JButton(new ImageIcon("ImageIcone/images-rouge.png" )), //icône trait rouge
blue = new JButton(new ImageIcon("ImageIcone/images-bleu.png" )), //icône trait bleu
cyan2 = new JButton(new ImageIcon("ImageIcone/images-cyan.png" )), //icône trait cyan
green = new JButton(new ImageIcon("ImageIcone/images-vert.png" )), //icône trait vert
grey = new JButton(new ImageIcon("ImageIcone/images-gris.png" )), //icône trait gris
black = new JButton(new ImageIcon("ImageIcone/images-noir.png" )), //icône trait noir
 
rubber = new JButton(new ImageIcon("ImageIcone/images-gomme.png" )), //icône gomme
pencil = new JButton(new ImageIcon("ImageIcone/images-crayon.png" )), //icône crayon
corbeille = new JButton(new ImageIcon("ImageIcone/images-corbeille.png" )), //icône corbeille
placerBille = new JButton(new ImageIcon("ImageIcone/images-bille.png" )), //icône bille
 
play = new JButton(new ImageIcon("ImageIcone/images-play.png" )), //icône play
stop2 = new JButton(new ImageIcon("ImageIcone/images-stop.png" )), //icône stop
pause2 = new JButton(new ImageIcon("ImageIcone/images-pause.png" )); //icône pause
 
//LES ATTRIBUTS DES ÉCOUTEURS
private transient FormeListener fListener = new FormeListener();
private transient CouleurListener cListener = new CouleurListener();
 
//LES ATTRIBUTS DE LA ZONE DE DESSIN
private DrawPanel drawPanel = new DrawPanel();
private int a = 5; //épaisseur du trait fin
private int b = 10; //épaisseur du trait moyen
private int c = 15; //épaisseur du trait épais
private int xSizeFenetre = 1300; // hauteur de la fenêtre
private int ySizeFenetre = 900; // largeur de la fenêtre
 
private int level;
 
//LE CONSTRUCTEUR
 
/** contructeur de la fenêtre de jeu
*/
public Fenetre(int lev) {
this.level = lev;
this.setTitle("Line Rider" ); //titre de la fenêtre
this.setSize(xSizeFenetre, ySizeFenetre); //taille de la fenêtre de jeu
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.initMenu(); //initialisation du menu
this.initToolBar(); //initialisation de la barre d'outils
this.getContentPane().add(drawPanel, BorderLayout.CENTER);
 
this.setVisible(true); //rendre visible la fenêtre de jeu
//this.bille = new Bille(xDepart, yDepart, RAYON); // initialisation de la bille
 
// initialise le DrawPanel
drawPanel.setXSizeFenetre(xSizeFenetre);
drawPanel.setYSizeFenetre(ySizeFenetre);
drawPanel.setLevel(level);
initLevel();
drawPanel.initObstacle();
drawPanel.boucleInf();
}
 
//INITIALISATION DU MENU
private void initMenu() {
nouveau.addActionListener(new GestionNouveau());
 
quitter.addActionListener(new GestionQuitter());
 
menuBar.add(fichier);
menuBar.add(edition);
menuBar.add(action);
menuBar.add(musique);
 
fichier.add(nouveau);
fichier.add(quitter);
 
edition.add(couleur);
edition.add(crayon);
edition.add(gomme);
crayon.addActionListener(new GestionCrayon());
gomme.addActionListener(new GestionGomme());
placement.addActionListener(new GestionBille());
 
epaisseur.add(fin);
epaisseur.add(moyen);
epaisseur.add(epais);
fin.addActionListener(fListener);
moyen.addActionListener(fListener);
epais.addActionListener(fListener);
 
action.add(depart);
action.add(stop);
action.add(pause);
depart.addActionListener(new GestionPlay());
stop.addActionListener(new GestionStop());
pause.addActionListener(new GestionPause());
 
couleur.add(jaune);
couleur.add(orange);
couleur.add(rose);
couleur.add(rouge);
couleur.add(bleu);
couleur.add(cyan);
couleur.add(vert);
couleur.add(gris);
couleur.add(noir);
jaune.addActionListener(cListener);
orange.addActionListener(cListener);
rose.addActionListener(cListener);
rouge.addActionListener(cListener);
cyan.addActionListener(cListener);
bleu.addActionListener(cListener);
vert.addActionListener(cListener);
gris.addActionListener(cListener);
noir.addActionListener(cListener);
 
image.add(plage);
image.add(montagne);
image.add(pyramide);
image.add(maya);
image.add(paris);
image.add(newyork);
image.add(sydney);
image.add(londres);
image.add(pop);
image.add(vierge);
plage.addActionListener(new GestionBackground());
montagne.addActionListener(new GestionBackground());
pyramide.addActionListener(new GestionBackground());
maya.addActionListener(new GestionBackground());
paris.addActionListener(new GestionBackground());
newyork.addActionListener(new GestionBackground());
sydney.addActionListener(new GestionBackground());
londres.addActionListener(new GestionBackground());
pop.addActionListener(new GestionBackground());
vierge.addActionListener(new GestionBackground());
 
 
musique.add(playa);
musique.add(skibronze);
musique.add(pharaon);
musique.add(inca);
musique.add(elysee);
musique.add(ny);
musique.add(ld);
musique.add(syd);
musique.add(mika);
playa.addActionListener(new GestionMusic());
skibronze.addActionListener(new GestionMusic());
pharaon.addActionListener(new GestionMusic());
inca.addActionListener(new GestionMusic());
elysee.addActionListener(new GestionMusic());
ny.addActionListener(new GestionMusic());
ld.addActionListener(new GestionMusic());
syd.addActionListener(new GestionMusic());
mika.addActionListener(new GestionMusic());
 
 
this.setJMenuBar(menuBar);
}
 
//INITIALISATION DE LA BARRE D'OUTIL
private void initToolBar() {
 
small.addActionListener(fListener);
medium.addActionListener(fListener);
large.addActionListener(fListener);
 
toolBar.addSeparator();
toolBar.add(yellow);
toolBar.add(orange2);
toolBar.add(pink);
toolBar.add(red);
toolBar.add(blue);
toolBar.add(cyan2);
toolBar.add(green);
toolBar.add(grey);
toolBar.add(black);
yellow.addActionListener(cListener);
orange2.addActionListener(cListener);
pink.addActionListener(cListener);
red.addActionListener(cListener);
blue.addActionListener(cListener);
cyan2.addActionListener(cListener);
green.addActionListener(cListener);
grey.addActionListener(cListener);
black.addActionListener(cListener);
 
toolBar.addSeparator();
toolBar.add(play);
toolBar.add(stop2);
toolBar.add(pause2);
play.addActionListener(new GestionPlay());
stop2.addActionListener(new GestionStop());
pause2.addActionListener(new GestionPause());
placerBille.addActionListener(new GestionBille());
 
toolBar.addSeparator();
toolBar.add(rubber);
toolBar.add(pencil);
toolBar.add(corbeille);
rubber.addActionListener(new GestionGomme());
pencil.addActionListener(new GestionCrayon());
corbeille.addActionListener(new GestionNouveau());
 
this.getContentPane().add(toolBar, BorderLayout.NORTH);
}
 
//INITIALISE LE LEVEL
private void initLevel() {
switch (level) {
case 0:
 
toolBar.addSeparator();
toolBar.add(placerBille);
toolBar.addSeparator();
toolBar.add(small);
toolBar.add(medium);
toolBar.add(large);
 
menuBar.add(image);
edition.add(placement);
edition.add(epaisseur);
 
setVisible(true);
placerBille.addActionListener(new GestionBille());
 
 
break;
case 1:
 
break;
case 2:
 
break;
case 3:
 
break;
}
}
 
 
//ÉCOUTEUR POUR LA REMISE A ZERO
 
class GestionNouveau implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
 
drawPanel.setNomImage(null);
drawPanel.setStop(true);
drawPanel.setPlay(false);
drawPanel.setDraw(true);
drawPanel.setClic(false);
drawPanel.setPause(false);
drawPanel.erase();
}
}
 
//ÉCOUTEUR POUR QUITTER
 
class GestionQuitter implements ActionListener {
public void actionPerformed(ActionEvent arg0) {
System.exit(0);
}
}
 
 
//ECOUTEUR POUR CHARGER UNE MUSIQUE
 
public class GestionMusic implements ActionListener {
public void actionPerformed(ActionEvent e){
if (e.getSource() == playa){
Sound player = new Sound ("Musics/Beach - Vamos a la playa - Guitar Cover.mp3" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == skibronze){
Sound player = new Sound ("Musics/Mountain - Les bronzes font du ski.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == pharaon){
Sound player = new Sound ("Musics/Egypt - Pharaoh Ramses II.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == inca){
Sound player = new Sound ("Musics/Maya - Christopher Tin - Baba Yetu.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if(e.getSource() == elysee){
Sound player = new Sound ("Musics/Paris - Les Champs Elisées.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == ny){
Sound player = new Sound ("Musics/NY - Frank Sinatra - New York New York.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == ld){
Sound player = new Sound ("Musics/London -The Clash - London Calling.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == syd){
Sound player = new Sound ("Musics/Sydney - Australian Aboriginal Rock Music.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
else if (e.getSource() == mika){
Sound player = new Sound ("Musics/Pop Color - Mika - Relax.wav" );
InputStream stream = new ByteArrayInputStream(player.getSamples());
player.play(stream);
}
}
}
 
//ECOUTEUR POUR LANCER LA SIMULATION
 
public class GestionPlay implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setDraw(false); //on ne peut plus dessiner
drawPanel.setPlay(true);
drawPanel.setPause(false);
}
}
 
//ECOUTEUR POUR ARRETER LA SIMULATION
 
public class GestionStop implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setStop(true);
drawPanel.setPlay(false);
drawPanel.setDraw(true);
drawPanel.setClic(false);
drawPanel.setPause(false);
}
}
 
//ECOUTEUR POUR METTRE LA SIMULATION EN PAUSE
 
public class GestionPause implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setPause(true);
drawPanel.setPlay(false);
drawPanel.setDraw(false);
drawPanel.setClic(false);
}
}
 
//ECOUTEUR POUR PLACER LA BILLE
 
public class GestionBille implements ActionListener {
public void actionPerformed(ActionEvent e) {
drawPanel.setPause(false);
drawPanel.setPlay(false);
drawPanel.setDraw(false);
drawPanel.setClic(false);
drawPanel.setPlacerBille(true);
}
}
 
}
 
 
Et le lecteur de musique:
 
package linerider2;
 
import java.io.DataInputStream;
import java.io.File;
import java.io.IOException;
import java.io.InputStream;
import javax.sound.sampled.*;
import java.io.ByteArrayInputStream;
 
public class Sound{
private AudioFormat format;
private byte[] samples;
/**
*
* @param filename le lien vers le fichier song (URL ou absolute path)
*/
public Sound(String filename){
try{
AudioInputStream stream = AudioSystem.getAudioInputStream(new File(filename));
format = stream.getFormat();
samples = getSamples(stream);
}
catch (UnsupportedAudioFileException e){
e.printStackTrace();
}
catch (IOException e){
e.printStackTrace();
}
}
public byte[] getSamples(){
return samples;
}
public byte[] getSamples(AudioInputStream stream){
int length = (int)(stream.getFrameLength() * format.getFrameSize());
byte[] samples = new byte[length];
DataInputStream in = new DataInputStream(stream);
try{
in.readFully(samples);
}
catch (IOException e){
e.printStackTrace();
}
return samples;
}
public void play(InputStream source) {
int bufferSize = format.getFrameSize() * Math.round(format.getSampleRate() / 10);
byte[] buffer = new byte[bufferSize];
SourceDataLine line;
try{
DataLine.Info info = new DataLine.Info(SourceDataLine.class, format);
line = (SourceDataLine)AudioSystem.getLine(info);
line.open(format, bufferSize);
}
catch (LineUnavailableException e){
e.printStackTrace();
return;
}
line.start();
try{
int numBytesRead = 0;
while (numBytesRead != -1){
numBytesRead = source.read(buffer, 0, buffer.length);
if (numBytesRead != -1)
line.write(buffer, 0, numBytesRead);
}
}
catch (IOException e){
e.printStackTrace();
}
line.drain();
line.close();
}
}

Reply

Marsh Posté le 16-05-2015 à 18:01:48   

Reply

Marsh Posté le 27-08-2015 à 14:40:52    

Bonjour a toi, ca faitsait longtemps que je n'avait pas vu un code aussi bordellique :D
(la prochaine fois prends au moins la peine de l'indenter et de le mettre entre balise code (ou cpp) pour les forums, les tab ca ne marche pas ici ^^)
 
Avant de te lancer dans le multi Threading je te conseille fortement de découper plus ton code ^^ (l'ajout d'ENUM te symplifiera deja beaucoup la vie vue le nombre de variable que tu stoque !)
 
Bon, niveau des Threads, je te conseille de te renseigner sur quelques sites dans un premier temps,
 
mais en globalitée t'a 2 manieres de creer un Thread :  
 
1 : étendre ta classe de l'interface Runnable :

Code :
  1. public class Maclass implements Runnable {
  2.     public Maclass(parametres) {
  3.     }
  4.     @Override
  5.     public void run() {
  6.          //mettre ici les actions du thread
  7.     }
  8. }


et de demarrer ton thread ainsi :

Code :
  1. Maclasse m = new Maclasse(parametres);
  2. new Thread(m).start();


 
2 : etendre une classe de la classe Thread :

Code :
  1. public class Maclass extends Thread {
  2.     public Maclass(parametres) {
  3.     }
  4.     @Override
  5.     public void run() {
  6.          //mettre ici les actions du thread
  7.     }
  8. }


et de lancer le thread ainsi :

Code :
  1. new Maclasse(parametres).start();


 
Attention : quelque soit la maniere dont tu creer le Thread, il doit contenir la methode run() (sans parametres) qui contiens ce que fera le Thread et etre lancé avec la methode start() (héritée de Thread, tu n'a pas besoins de la redéfinire)
 
Tu peux aussi creer un Thread en classe anonyme :  

Code :
  1. new Thread() {
  2.       @Override
  3.       public void run() {
  4.            //actions du Thread
  5.       }
  6. }.start();


 
ou en Inner-class :  

Code :
  1. public class MaGrosseClass {
  2.     public class MaClass extends Thread {
  3.           public Maclass(parametres) {
  4.           }
  5.           @Override
  6.           public void run() {
  7.                 //mettre ici les actions du thread
  8.           }
  9.    }
  10.    public MaGrosseClass() {
  11.          new Maclass(parametres).start();
  12.    }
  13. }


 
enfin franchement, regarde d'abord sur internet : t'a un milliard de doc sur les Thread (d'ailleurs c'est faux de dire que cela creer des actions simultannées, c'est juste la JVM qui va alterner l'execution de chaque thread ce qui produit un semblant de simultanéitée)


Message édité par gueuldange le 27-08-2015 à 15:00:51
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed