Ecouteur d'évènement Java

Résolu/Fermé
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - Modifié par Pulsar360 le 25/03/2013 à 23:48
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 - 4 avril 2013 à 22:45
Bonjour,

Je suis sur un projet mais j'ai besoin de déplacer un élément dans une fenêtre Java grâce à des touches claviers ("a" et "q" pour déplacer l'élément vers le haut et le bas).

Mon problème est que je n'arrive pas à déplacer mon élément.

Voici mes classes:

// Class MaClasse

public class MaClasse {
public static void main(String[] args) {
Fenetre fen = new Fenetre();
}
}

-------------------------------------------------------------

// Classe Fenetre

public class Fenetre extends JFrame {
Table tab = new Table();
public Fenetre() {

this.setTitle("Salut");
this.setSize(800, 500);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setVisible(true);
this.setContentPane(tab);
this.setBackground(new Color(200,200,200));
}
}

-------------------------------------------------------------

// Classe Table

import java.awt.*;
import javax.swing.*;
import java.awt.event.KeyEvent;

public class Table extends JPanel{

private int posXLT = 10;
private int posYHT = 10;
private int posXL = 10;
private int posYH;

public int getPosYH() {
return posYH;
}
public void setPosYH(int posYH) {
this.posYH = posYH;
}

public void paintComponent(Graphics g) {

g.setColor(new Color(240,240,240));
g.fillRect(posXLT, posYHT, (this.getWidth() - posXLT*2), (this.getHeight() - posYHT*2));
g.setColor(new Color(0,0,0));
g.fillRect(posXL, posYH+5, (this.getHeight()/8/4), (this.getHeight()/8));
g.fillRect(posXL+10, posYH+30, (this.getHeight()/8/4), (this.getHeight()/8));

}
public void keyPressed(KeyEvent e) {
char touche = e.getKeyChar();
if ('a' == touche) {
posYH = posYH + 10;
} else if ('q' == touche) {
posYH = posYH - 10;
} else {
posYH++;
}
}
}


Si une âme charitable pouvais m'aider je l'en remercie d'avance car je suis en galère depuis un bon petit moment.
A voir également:

5 réponses

walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 26/03/2013 à 02:29
Bonsoir,

pour détecter les touches du clavier, il faut absolument implémenter la classe KeyListener. cette implémentation implique la redéfinition de ttes ses méthodes (keyPressed, KeyTyped et keyReleased).

(on peut par exemple les regrouper dans une classe interne ClavieListener par exemple, juste pour regrouper le code)

deux choses importantes manqué dans ton code:
- dans la classe Fenetre: this.addKeyListener(Classe KeyListener);
- la fonction repaint() qui ré-affiche ta fenetre avec ton panneau Table actualisé: this.repaint().

et voila ton code modifié:

//Classe MaClasse:
public class MaClasse {   
 public static void main(String[] args) {   
  Fenetre fen = new Fenetre();   
 }   
}


//Classe Fenetre:
import java.awt.Color;   
import java.awt.event.KeyEvent;   
import java.awt.event.KeyListener;   

import javax.swing.JFrame;   


public class Fenetre extends JFrame{   
 Table tab = new Table();   
 public Fenetre() {   

  this.setTitle("Salut");   
  this.setSize(800, 500);   
  this.setLocationRelativeTo(null);   
  this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);   
  this.setVisible(true);   
  //La fenetre doit ecouter les événnements du clavier   
  //*************************************************   
  this.addKeyListener(new ClavierListener());   
  this.setContentPane(tab);   
  this.setBackground(new Color(200,200,200));   
 }   
 class ClavierListener implements KeyListener{   

  @Override   
  public void keyTyped(KeyEvent e) {   
   if(e.getKeyChar()=='a')   
    tab.setPosYH(tab.getPosYH()+10);   
   else if(e.getKeyChar()=='q')   
    tab.setPosYH(tab.getPosYH()-10);   
   else   
    tab.setPosYH(tab.getPosYH()+1);   
   tab.repaint();   
  }   

  @Override   
  public void keyPressed(KeyEvent e) {   
   // TODO Auto-generated method stub   
      
  }   

  @Override   
  public void keyReleased(KeyEvent e) {   
   // TODO Auto-generated method stub   
      
  }   
     
 }   
} 


//Classe Table (qui est un panneau normalement)
import java.awt.Color;   
import java.awt.Graphics;   
import java.awt.event.KeyEvent;   

import javax.swing.JPanel;   

public class Table extends JPanel{   

 private int posXLT = 10;   
 private int posYHT = 10;   
 private int posXL = 10;   
 private int posYH;   

 public int getPosYH() {   
  return posYH;   
 }   
 public void setPosYH(int posYH) {   
  this.posYH = posYH;   
 }   

 public void paintComponent(Graphics g) {   

  g.setColor(new Color(240,240,240));   
  g.fillRect(posXLT, posYHT, (this.getWidth() - posXLT*2), (this.getHeight() - posYHT*2));   
  g.setColor(new Color(0,0,0));   
  g.fillRect(posXL, posYH+5, (this.getHeight()/8/4), (this.getHeight()/8));   
  g.fillRect(posXL+10, posYH+30, (this.getHeight()/8/4), (this.getHeight()/8));   

 }   
}


NB: Tu peux encore jouer sur l'affichage pour bien éliminer ttes les anomalies, mais l'idée principale de l'interface KeyListener reste la même.

Bonne chance

Being normal is boring... being geek is interesting
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
27 mars 2013 à 02:12
Merci de ton aide, c'est super sympas, effectivement je n'avais pas bien implanter la classe KeyListener.
Je viens d'utiliser ta correction et j'ai rajouter deux trois truc, par contre j'ai un autre souci, j'essaye de faire un pingpong à deux joueur sur le même clavier, seulement il n'est possible de gérer que une seul entrer clavier à la fois, c'est à dire si le premier joueur bouge ça raquette le deuxième joueur ne peut pas bouger la sienne (sauf en interrompant l'action du joueur 1).

Voici le nouveau code:

// Classe PingPong
import java.awt.*;
import javax.swing.*;

public class PingPong {
	public static void main(String[] args) {
	Fenetre fen = new Fenetre();
	}
}

// Classe Fenetre
import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class Fenetre extends JFrame {
	Table tab = new Table();
	public Fenetre() {
	this.setTitle("Salut");
	this.setSize(800, 500);
	this.setLocationRelativeTo(null);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setVisible(true);
	this.addKeyListener(new ClavierListener());
	this.setContentPane(tab);
	this.setBackground(new Color(200,200,200));
	}
	
	class ClavierListener implements KeyListener{
	
	public void keyTyped(KeyEvent e) {
	if((e.getKeyChar()=='a'||e.getKeyChar()=='A') && tab.getPosYHRG()>=5)
	tab.setPosYHRG(tab.getPosYHRG()-10); 
	else if((e.getKeyChar()=='q'||e.getKeyChar()=='Q') && tab.getPosYHRG() < (tab.getHeight() - (tab.getHeight()/8) - 20) )
	tab.setPosYHRG(tab.getPosYHRG()+10);
	if((e.getKeyChar()=='p'||e.getKeyChar()=='P') && tab.getPosYHRD()>=5)
	tab.setPosYHRD(tab.getPosYHRD()-10); 
	else if((e.getKeyChar()=='m'||e.getKeyChar()=='M') && tab.getPosYHRD() < (tab.getHeight() - (tab.getHeight()/8) - 20) )
	tab.setPosYHRD(tab.getPosYHRD()+10);
	tab.repaint();
	
	}
	
	public void keyPressed(KeyEvent e) {
	}

	public void keyReleased(KeyEvent e) {
	}
	}
}


// Classe Table
import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;

public class Table extends JPanel {
	
	private int posXLT = 10;
	private int posYHT = 10;
	
	private int posXLRG = 20;
	private int posYHRG;
	
	private int posXLRD = 20;
	private int posYHRD;
	
	public int getPosYHRG() {
	return posYHRG;
	}
	
	public void setPosYHRG(int posYHRG) {
	this.posYHRG = posYHRG;
	}
	
	public int getPosYHRD() {
	return posYHRD;
	}
	
	public void setPosYHRD(int posYHRD) {
	this.posYHRD = posYHRD;
	}
	
	public void paintComponent(Graphics g) {
	
	g.setColor(new Color(240,240,240));
	g.fillRect(posXLT, posYHT, (this.getWidth() - posXLT*2), (this.getHeight() - posYHT*2));
	g.setColor(new Color(0,0,0));
	g.fillRect(posXLRG, posYHRG+10, (this.getHeight()/8/4), (this.getHeight()/8));
	g.fillRect(this.getWidth()-20-(this.getHeight()/8/4), posYHRD+10, (this.getHeight()/8/4), (this.getHeight()/8));
	}
}
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
27 mars 2013 à 16:59
Je me suis dépatouiller tous seul.

Voici la solution si ça intéresse quelqu'un un jour, il vous suffit de remplacer ma classe fenetre par ceci:

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class Fenetre extends JFrame {
	Table tab = new Table();
	public Fenetre() {
	this.setTitle("Salut");
	this.setSize(859, 568);
	this.setLocationRelativeTo(null);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setVisible(true);
	this.addKeyListener(new ClavierListener());
	this.setContentPane(tab);
	this.setBackground(new Color(200,200,200));
	}
	
	class ClavierListener implements KeyListener{
	private boolean touchea = false;
	private boolean toucheq = false;
	private boolean touchep = false;
	private boolean touchem = false;

	public void keyTyped(KeyEvent e) {
	
	if(touchea == true) {
	tab.setPosYHRG(tab.getPosYHRG()-10); }
	if(toucheq == true) {
	tab.setPosYHRG(tab.getPosYHRG()+10); }
	if(touchep == true) {
	tab.setPosYHRD(tab.getPosYHRD()-10); }
	if(touchem == true) {
	tab.setPosYHRD(tab.getPosYHRD()+10); }
	tab.repaint();
	
		try { Thread.sleep(1); }
		catch (InterruptedException ie) { ie.printStackTrace(); }
	}

	public void keyPressed(KeyEvent e) {
	
	if (e.getKeyChar()=='a') {
	touchea = true; }
	else if (e.getKeyChar() == 'q') {
	toucheq = true; }
	else if (e.getKeyChar()=='p') {
	touchep = true; }
	else if (e.getKeyChar() == 'm') {
	touchem = true; }
	}
	
	public void keyReleased(KeyEvent e) {

	if (e.getKeyChar()=='a') {
	touchea = false; }
	else if (e.getKeyChar() == 'q') {
	toucheq = false; }
	else if (e.getKeyChar()=='p') {
	touchep = false; }
	else if (e.getKeyChar() == 'm') {
	touchem = false; }
	}
	}
}



Par contre je rencontre encore un souci en faisant comme cela; disons que le joueur 1 appuis sur 'q' pour descendre ça raquette et juste après le joueur 2 appuie sur 'm' pour baisser la sienne également, et bien les deux raquettes baisse, MAIS si le joueur 2 arrête d'appuyer sur 'm' ce sont les deux raquettes qui s'arrête, hors j'aimerais que la raquette du joueur 1 continue ça course vue que lui est encore en train d'appuyer sur le bouton 'q'.

Quelqu'un pour m'aider?

P.S.: Les 2 raquettes peuvent sortir hors de la fenêtre avec ce code car j'ai pas laisser les limites, si vous les souhaitez il vous suffit de les rajouter.
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
27 mars 2013 à 19:12
Bonjour,

si on essaie d'espionner sur nos booleans, on peut détecter peut être une des limitation de la keyListener en java. Modifie le code de la classe Fenetre pour comme ainsi:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;
import javax.swing.Timer;

public class Fenetre extends JFrame{
	Table tab = new Table();
	private boolean touchea = false;
	private boolean toucheq = false;
	private boolean touchep = false;
	private boolean touchem = false;
	private Thread thread;

	public Fenetre() {
		this.setTitle("Salut");
		this.setSize(859, 568);
		this.setLocationRelativeTo(null);
		this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		this.setVisible(true);
		this.addKeyListener(new ClavierListener());
		this.setContentPane(tab);
		this.setBackground(new Color(200,200,200));
		
		/*Timer timer = new Timer(2000, new ActionListener() {

			@Override
			public void actionPerformed(ActionEvent e) {
				System.out.println("Etat des touches: \ta: "+touchea+",\t q: "+toucheq+",\t " +
						"p: "+touchep+",\t m: "+touchem);
			}
		});
		timer.start();*/
	}

	class ClavierListener implements KeyListener{
				
		public void keyTyped(KeyEvent e) {

			String message= new String("touches enfoncées: ");
			int deplacement=1;
			if(touchea == true) {
				tab.setPosYHRG(tab.getPosYHRG()-deplacement);
				message+=", a";}
			if(toucheq == true) {
				tab.setPosYHRG(tab.getPosYHRG()+deplacement);
				message+=", q";}
			if(touchep == true) {
				tab.setPosYHRD(tab.getPosYHRD()-deplacement);
				message+=", p";}
			if(touchem == true) {
				tab.setPosYHRD(tab.getPosYHRD()+deplacement);
				message+=", m";}
			tab.repaint();
			System.out.println(message);

			/*try { Thread.sleep(1); }
			catch (InterruptedException ie) { ie.printStackTrace(); }*/
		}

		public void keyPressed(KeyEvent e) {

			if (e.getKeyChar()=='a') {
				touchea = true;}
			else if (e.getKeyChar() == 'q') {
				toucheq = true;}
			else if (e.getKeyChar()=='p') {
				touchep = true;}
			else if (e.getKeyChar() == 'm') {
				touchem = true;}
		}

		public void keyReleased(KeyEvent e) {

			String message= new String("touches relachées: ");
			if (e.getKeyChar()=='a') {
				touchea = false;
				message+="a";}
			else if (e.getKeyChar() == 'q') {
				toucheq = false;
				message+="q";}
			else if (e.getKeyChar()=='p') {
				touchep = false;
				message+="p";}
			else if (e.getKeyChar() == 'm') {
				touchem = false;
				message+="m";}
			System.out.println(message);
		}
	}
}


on remarque que pour le cas de ton probleme qu'après relaché la 2ieme touche, l'autre reste tjrs en true, mais il n'y a pas de rafraichissement, c'est a dire, que la methode keyTyped ne se déclenche pas.

j'ai encore introduit des espions pour voir les touches relâchées, meme remarque, quand on relache la 2ieme touche enfoncée, la première ne s'affiche pas comme touche enfoncée. ce qui preuve définitivement que la méthode keyTyped ne se déclenche pas.

je pense qu'il faut chercher encore, dans les Threads, la concurrence entre les touches (car l'ordre d'enfoncer et relacher les touches influence le fonctionnement de ton programme) ou peut etre une méthode sophistiquée pour corriger le problème.

Bonne chance
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
27 mars 2013 à 20:13
Bonjour,
Merci bcp pour ton aide, c'est super sympas. Je vais chercher du coté des Threads et j'espère trouver, si jamais tu pense à quelque chose n'hésite pas à m'en faire par, des que je trouve la solution je la poste de toute manière, ça pourra toujours servir à une autre personne.

Bonne soirée.
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
28 mars 2013 à 20:16
Apparemment il me faudrais un Thread mais je n'arrive pas à l'utiliser, si une personne pouvais m'aider !!
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
Modifié par walidovich_85 le 29/03/2013 à 01:17
Bonjour chef,

enfaite, la solution (pas encore testé) vient d'être confirmé par un de mes amis.
il consiste à créer un Thread quand on appuie sur une touche, et de le tuer (le meme Thread) quand on relache la touche qui la déclencher.

techniquement je ne sais pas encore comment introduire le thread, mais je vais chercher des exemples et faire l'echange avec toi.

Bonne chance

Being normal is boring... being geek is interesting
0
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
29 mars 2013 à 14:51
Bon j'ai un petit peu avancer (enfin je croit) mais ça ne fonctionne pas très bien, voir moins bien qu'avant vue que les raquettes ne bouge plus du tous. Mais je pense être sur la bonne voie.
Je te poste le codes si tu veux essayer de voir, mais le souci est certainement dans ma façon d'utiliser les Thread.

// Toujours la même classe Ping-Pong de départ:

import java.awt.*;
import javax.swing.*;

public class PingPongE {
	public static void main(String[] args) {
	FenetreE fen = new FenetreE();
	}
}

---------------------------------------------------------------------------------
// Classe FenetreE:

import java.awt.Color;
import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import javax.swing.JFrame;

public class FenetreE extends JFrame {
	TableE tab = new TableE();
	Joueur1 j1 = new Joueur1();
	Joueur2 j2 = new Joueur2();
	
	public FenetreE() {
	this.setTitle("Salut");
	this.setSize(800, 500);
	this.setLocationRelativeTo(null);
	this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
	this.setVisible(true);
	this.setContentPane(tab);
	this.setBackground(new Color(200,200,200));

	}
}
---------------------------------------------------------------------------------
// Classe TableE:

import java.awt.Color;
import java.awt.Graphics;
import java.awt.event.KeyEvent;
import javax.swing.JPanel;

public class TableE extends JPanel {
	
	private int posXLT = 10;
	private int posYHT = 10;
	
	private int posXLRG = 20;
	private int posYHRG;
	
	private int posXLRD = 20;
	private int posYHRD;
	
	public int getPosYHRG() {
	return posYHRG;
	}
	
	public void setPosYHRG(int posYHRG) {
	this.posYHRG = posYHRG;
	}
	
	public int getPosYHRD() {
	return posYHRD;
	}
	
	public void setPosYHRD(int posYHRD) {
	this.posYHRD = posYHRD;
	}
	
	public void paintComponent(Graphics g) {
	
	g.setColor(new Color(240,240,240));
	g.fillRect(posXLT, posYHT, (this.getWidth() - posXLT*2), (this.getHeight() - posYHT*2));
	g.setColor(new Color(0,0,0));
	g.fillRect(posXLRG, posYHRG+10, (this.getHeight()/8/4), (this.getHeight()/8));
	g.fillRect(this.getWidth()-20-(this.getHeight()/8/4), posYHRD+10, (this.getHeight()/8/4), (this.getHeight()/8));
	}
}
---------------------------------------------------------------------------------

//Nouvelle Classe Joueur1:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
	
	class Joueur1 implements KeyListener{
	
	private boolean touchea = false;
	private boolean toucheq = false;
	
	public boolean getTouchea() {
	return touchea;
	}
	
	public void setTouchea(boolean touchea) {
	this.touchea = touchea;
	}
	
	public boolean getToucheq() {
	return toucheq;
	}
	
	public void setToucheq(boolean toucheq) {
	this.toucheq = toucheq;
	}
	
	TableE tabJ1 = new TableE();

	public void keyTyped(KeyEvent e) {
	
	ThreadJoueur1 joueur1 = new ThreadJoueur1();
	joueur1.start();
	
	//Je ne sais pas si il faut mettre repaint ici...
	tabJ1.repaint();
	
	//c'est peut etre pas utilise de mettre le thread.sleep() ici si on le met dans ThreadJoueur1
	/*	try { Thread.sleep(1); }
		catch (InterruptedException ie) { ie.printStackTrace(); }*/
	}

	public void keyPressed(KeyEvent e) {
	
	if (e.getKeyChar()=='a') {
	touchea = true; }
	else if (e.getKeyChar() == 'q') {
	toucheq = true; }
	}
	
	public void keyReleased(KeyEvent e) {

	if (e.getKeyChar()=='a') {
	touchea = false; }
	else if (e.getKeyChar() == 'q') {
	toucheq = false; }
	}
	}
---------------------------------------------------------------------------------
// Nouvelle Classe ThreadJoueur1:

class ThreadJoueur1 extends Thread {
	ThreadJoueur1() {
	// ... code du constructeur ???? peut etre à créer, je ne sais pas encore ce qu'il faut mettre ici
	
	
	}
	
	public void run() {
	Joueur1 joueur1 = new Joueur1();
	TableE tableJ1 = new TableE();
	
	if(joueur1.getTouchea() == true) {
	tableJ1.setPosYHRG(tableJ1.getPosYHRG()-10); }
	//penser au conflie si joueur1 appuie sur 'a' ET sur 'q'.
	else if(joueur1.getToucheq() == true) {
	tableJ1.setPosYHRG(tableJ1.getPosYHRG()+10); }
	
	//mettre un Threas.sleep() dans un catch pour executer seulement un temps ce thread ci et laisser un 
	// autre threas s'executer pour permettre au joueur2 de déplacer ca raquette a lui aussi.
	}
}
---------------------------------------------------------------------------------
//Nouvelle Classe Joueur2:

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
	
	class Joueur2 implements KeyListener{
	
	private boolean touchep = false;
	private boolean touchem = false;
	
	public boolean getTouchep() {
	return touchep;
	}
	
	public void setTouchep(boolean touchep) {
	this.touchep = touchep;
	}
	
	public boolean getTouchem() {
	return touchem;
	}
	
	public void setTouchem(boolean touchem) {
	this.touchem = touchem;
	}
	
	TableE tabJ2 = new TableE();

	public void keyTyped(KeyEvent e) {
	
	ThreadJoueur2 joueur2 = new ThreadJoueur2();
	joueur2.start();
	
	//C'est peut etre inutile de mettre le repaint ici si on peut le mettre dans le thread joueur1
	tabJ2.repaint();
	
	//c'est peut etre pas utilise de mettre le thread.sleep() ici si on le met dans ThreadJoueur1
	/*	try { Thread.sleep(1); }
		catch (InterruptedException ie) { ie.printStackTrace(); }*/
	}

	public void keyPressed(KeyEvent e) {
	
	if (e.getKeyChar()=='p') {
	touchep = true; }
	else if (e.getKeyChar() == 'm') {
	touchem = true; }
	}
	
	public void keyReleased(KeyEvent e) {

	if (e.getKeyChar()=='p') {
	touchep = false; }
	else if (e.getKeyChar() == 'm') {
	touchem = false; }
	}
	}
---------------------------------------------------------------------------------
//Nouvelle Classe ThreadJoueur2:

class ThreadJoueur2 extends Thread {
	ThreadJoueur2() {
	// ... code du constructeur ???? peut etre à créer, je ne sais pas encore ce qu'il faut mettre ici
	
	
	}
	
	public void run() {
	Joueur2 joueur2 = new Joueur2();
	TableE tableJ2 = new TableE();
	
	if(joueur2.getTouchep() == true) {
	tableJ2.setPosYHRG(tableJ2.getPosYHRG()-10); }
	//penser au conflie si joueur1 appuie sur 'a' ET sur 'q'.
	else if(joueur2.getTouchem() == true) {
	tableJ2.setPosYHRG(tableJ2.getPosYHRG()+10); }
	
	//mettre un Threas.sleep() dans un catch pour executer seulement un temps ce thread ci et laisser un 
	// autre threas s'executer pour permettre au joueur2 de déplacer ca raquette a lui aussi.
	}
}




Voilas, j'ai séparer chaque Joueur et créer une classe Thread pour chaqu'un d'eux afin de pouvoir mieux moduler le code.

J'ai renommer les Classe avec un "E" car j'ai garder une copie d'un précédent code au cas ou il faille revenir en arrière.
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
29 mars 2013 à 17:33
bon une lecture rapide de kelkin ki n'a pa dormi hier:
1-ta fenetre n'implemente pas l'interface keylistener, c pr ça ke tes objets ne bougent pas.
2-tabJ1 n'est pas relié dans la fenetre ou a la table du fenetre, d'abord ce le paintcomponent du Table qui permet de rafraichir les Objets ne sera pas appelé.
3- je sui totalement perdu dans le code des joueurs, manque du sommeil ou peut etre, mais je ne voit pa la liaison des joueurs dans la Table ou la fenetre, ils sont juste déclaré... ou peut etre je ne voi pa le code en clair.

entre autre c pr ça ke j'ai pensé à simplifier le probleme, puisk nous visons l'aide des autres. car personne ne va casser la tete pour comprendre le code completement et de proposer l'aide.
0
walidovich_85 Messages postés 608 Date d'inscription mardi 12 janvier 2010 Statut Membre Dernière intervention 25 octobre 2015 73
29 mars 2013 à 17:36
Voila le code ke j'ai fai pour pouvoir demandé l'aide: il s'agit tt simplement d'affiché les touches qui sont enfoncées.

import java.awt.event.KeyEvent;
import java.awt.event.KeyListener;
import java.util.HashSet;
import java.util.Iterator;

import javax.swing.JFrame;

public class Clavier extends JFrame implements KeyListener {
	private HashSet<Character> touches = new HashSet<Character>();
	public Clavier(){
		this.setSize(120, 100);
		this.addKeyListener(this);
		this.setLocationRelativeTo(null);
		this.setVisible(true);
		this.setDefaultCloseOperation(EXIT_ON_CLOSE);
	}
	@Override
	public void keyPressed(KeyEvent arg0) {
		touches.add(arg0.getKeyChar());
	}
	@Override
	public void keyReleased(KeyEvent arg0) {
		touches.remove(arg0.getKeyChar());
		if(touches.isEmpty())
			System.out.println("Aucune touche n'est enfoncée");
	}
	@Override
	public void keyTyped(KeyEvent arg0) {
		String message= new String("Les touches enfoncées sont: ");
		Iterator iter= touches.iterator();
		while(iter.hasNext()){
			//if(e.)
			message+=", "+iter.next();
		}
		System.out.println(message);
	}
	
	public static void main(String[] args) {
		Clavier clavier= new Clavier();
	}
}


je vais essayer avec ce code, de chercher comment introduire les Thread, puisk c le meme comportement de ton jeu ping pong (si j'apui sur A et pui sur B et je relache B, A ne se voi pa comme enfoncé <=> l'arrêt de la raquette 1)

Bonne chance
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Pulsar360 Messages postés 114 Date d'inscription lundi 12 novembre 2012 Statut Membre Dernière intervention 29 août 2018 10
4 avril 2013 à 22:45
C'est bon j'ai réussis, j'ai galérer pendant 1 semaine.
Je poste la SOLUTION pour ceux qui un jour en aurai besoin :

// Classe Test :
import javax.swing.JFrame; 

public class Test { 
  
 public static void main(String[] args) { 
   
  MyKeyAdapter adapt = new MyKeyAdapter(); 
   
  JFrame fen = new JFrame(); 
   fen.setTitle("Test"); 
   fen.setSize(200,100); 
   fen.addKeyListener(adapt); 
   fen.setVisible(true); 
   fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    
   int i = 100; 
   while (i > 0) { 
    
   ThreadA  tA = new ThreadA(adapt.doAction()); 
   tA.start(); 
    
   ThreadB  tB = new ThreadB(adapt.doAction2()); 
   tB.start(); 
    
   try { Thread.sleep(60); } 
   catch (InterruptedException ie) { ie.printStackTrace(); } } } } 


// Classe MyKeyAdapter :
import java.awt.event.KeyAdapter; 
import java.awt.event.KeyEvent; 

public class MyKeyAdapter extends KeyAdapter { 
  
 private boolean isAPressed = false; 
 private boolean isBPressed = false; 
 private boolean presser = false; 
  
 public boolean getPresser() { 
 return presser;} 
 public void setPresser(boolean presser) { 
 this.presser = presser; 
 } 
  
 public void keyPressed(KeyEvent e) { 
  if(e.getKeyCode()== 0x41) { 
   presser = true; 
   isAPressed = true; }  
   
  if(e.getKeyCode()== 0x42) { 
   presser = true; 
   isBPressed = true; } } 
  
 public void keyReleased(KeyEvent e) { 
  if(e.getKeyCode()== 0x41) { 
   isAPressed = false; } 
   
  if(e.getKeyCode()== 0x42) { 
   isBPressed = false; } } 
  
 public boolean doAction() { 
  return isAPressed; } 
  
 public boolean doAction2() { 
  return isBPressed; } } 


// Classe ThreadA :
class ThreadA extends Thread { 
  
 private boolean joueur1; 
  
 public ThreadA(boolean joueur1) { 
  this.joueur1 = joueur1; } 
  
 public void run() { 
  if(joueur1 == true) 
  System.out.println(joueur1 + " Salut"); } } 


// Classe ThreadB :
class ThreadB extends Thread { 
  
 private boolean joueur1; 
  
 public ThreadB(boolean joueur1) { 
  this.joueur1 = joueur1; } 
  
 public void run() { 
  if(joueur1 == true) 
  System.out.println(joueur1 + " Coucou"); } } 


VOILAAAAAAAAS !!

Bien sure quelques modifications apporté serait pas une mauvaise idée.
0