Posez votre question Signaler

Java écouteurs

hugo0x 18Messages postés 27 octobre 2009Date d'inscription - Dernière réponse le 28 oct 2009 à 13:39
Bonjour,
le code ci dessous m'affiche ma fenetre, mon fond, mes bouttons, mais rien ne s'affiche dans la console lorsque je tente de cliquer sur les bouttons, ou de taper quelquechose au clavier...
Merci d'avance
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class fenetre  extends JFrame implements ActionListener {
	JButton jbPlay;
	JButton jbClose;
	JLabel label; 
    
    //***********french notes.. :D*************

	public fenetre (String titre) {                 //création de la méthode constructeur
		setTitle (titre);
		Container contenu = getContentPane();

		JButton jbPlay = new JButton("", new ImageIcon("jouer.gif"));
		JButton jbClose = new JButton("", new ImageIcon("exit.gif"));

		jbPlay.setFocusPainted(false);
		jbPlay.setBorderPainted(false);                  // ces trois lignes enelvent la bordure du boutton
		jbPlay.setContentAreaFilled(false);

		jbClose.setFocusPainted(false);
		jbClose.setBorderPainted(false);               // ces trois lignes sont les meme que la haut :)
		jbClose.setContentAreaFilled(false);

		contenu.setLayout(null);
		JLabel label = new JLabel();
		Image image = Toolkit.getDefaultToolkit().createImage("background.gif");// nouveau JLabel backgound
		label.setIcon(new ImageIcon(image));

		contenu.add(jbPlay, 0);
		contenu.add(jbClose, 1);
		contenu.add(label, 2);
		label.setBounds(0, 0, 900, 800);
		jbPlay.setBounds(50, 445, 850, 78);
		jbClose.setBounds(50, 640, 158, 50);
		
		
		ActionListener play = null;
		jbPlay.addActionListener(play); 
		
		ActionListener close = null;
	    jbClose.addActionListener(close);      
	
		setSize(907,832);
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
	
		
	}

	public void actionPerformed(ActionEvent play) {
		System.out.print("it work !!!");
	}}
Lire la suite 

Java écouteurs »

Suggestions
11 réponses
Réponse
+0
moins plus
L'erreur vient de là:

ActionListener play = null;
jbPlay.addActionListener(play); 
		
ActionListener close = null;
jbClose.addActionListener(close); 


Comme tu as implémenté l'interface Listener, et que tu as ta méthode actionPerformed, il faut que tu fasses appel à ta propre classe puisqu'elle implémente Listener.

La solution serait donc:

jbPlay.addActionListener(this); 
jbClose.addActionListener(this); 
Ajouter un commentaire
Réponse
+0
moins plus
ho! merci ! merci beaucoup!

Et, en passant, connais tu le code pour fermer une fenêtre?

Voila:
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class fenetre  extends JFrame implements ActionListener {
	JButton jbPlay;
	JButton jbClose;
	JLabel label; 
    
    //***********french notes.. :D*************

	public fenetre (String titre) {                 //création de la méthode constructeur
		setTitle (titre);
		Container contenu = getContentPane();

		JButton jbPlay = new JButton("", new ImageIcon("jouer.gif"));
		JButton jbClose = new JButton("", new ImageIcon("exit.gif"));

		jbPlay.setFocusPainted(false);
		jbPlay.setBorderPainted(false);                  // ces trois lignes enelvent la bordure du boutton
		jbPlay.setContentAreaFilled(false);

		jbClose.setFocusPainted(false);
		jbClose.setBorderPainted(false);               // ces trois lignes sont les meme que la haut :)
		jbClose.setContentAreaFilled(false);

		contenu.setLayout(null);
		JLabel label = new JLabel();
		Image image = Toolkit.getDefaultToolkit().createImage("background.gif");// nouveau JLabel backgound
		label.setIcon(new ImageIcon(image));

		contenu.add(jbPlay, 0);
		contenu.add(jbClose, 1);
		contenu.add(label, 2);
		label.setBounds(0, 0, 900, 800);
		jbPlay.setBounds(50, 445, 850, 78);
		jbClose.setBounds(50, 640, 158, 50);
		
		
		ActionListener play = null;
		jbPlay.addActionListener(this); 
		
		ActionListener close = null;
	    jbClose.addActionListener(this);      
	
		setSize(907,832);
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
	
		
	}

	public void actionPerformed(ActionEvent play) {
		 jeu();
	}

	private void jeu() {
		
		jeu j = new jeu("Doode");
		
	}}


La classe jeu crée une nouvelle fenetre, mais je ne trouve pas comment fermer celle ci...
j'ai même essayé de faire croire au programme que le joueur cliquait sur la croix...
Ajouter un commentaire
Réponse
+0
moins plus
Oui, dans ton constructeur tu peux mettre :
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

Sinon, tu as la méthode dispose() (que tu places sur un événement).
Ajouter un commentaire
Réponse
+0
moins plus
Merci, et pour finir, es-ce normal que quand je presse n'importe quel bouton, cela m'effectue toujours la même action...(m'ouvre ma seconde fenêtre et ne ferme rien)
J'ai testé ceci :

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;

public class fenetre  extends JFrame implements ActionListener {
	JButton jbPlay;
	JButton jbClose;
	JLabel label; 
    
    //***********french notes.. :D*************

	public fenetre (String titre) {                 //création de la méthode constructeur
		setTitle (titre);
		Container contenu = getContentPane();

		JButton jbPlay = new JButton("", new ImageIcon("jouer.gif"));
		JButton jbClose = new JButton("", new ImageIcon("exit.gif"));

		jbPlay.setFocusPainted(false);
		jbPlay.setBorderPainted(false);                  // ces trois lignes enelvent la bordure du boutton
		jbPlay.setContentAreaFilled(false);

		jbClose.setFocusPainted(false);
		jbClose.setBorderPainted(false);               // ces trois lignes sont les meme que la haut :)
		jbClose.setContentAreaFilled(false);

		contenu.setLayout(null);
		JLabel label = new JLabel();
		Image image = Toolkit.getDefaultToolkit().createImage("background.gif");// nouveau JLabel backgound
		label.setIcon(new ImageIcon(image));

		contenu.add(jbPlay, 0);
		contenu.add(jbClose, 1);
		contenu.add(label, 2);
		label.setBounds(0, 0, 900, 800);
		jbPlay.setBounds(50, 445, 850, 78);
		jbClose.setBounds(50, 640, 158, 50);
		
		
		ActionListener play = null;
		jbPlay.addActionListener(this); 
		
		ActionListener close = null;
	    jbClose.addActionListener(this);      
	
		setSize(907,832);
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
	
		
	}

	public void actionPerformed(ActionEvent play) {
		
		jeu();
	}
	public void actionPerformed2(ActionEvent close) {
		dispose();
	}
	
	private void jeu() {
		
		jeu j = new jeu("Doode");
		
	}}

Ajouter un commentaire
Réponse
+0
moins plus
Attention, tu confonds.

public void actionPerformed(ActionEvent event) est une méthode de l'interface ActionListener.
Elle est utilisée pour tout ce qui est bouton (jusque là tu as bon).
Ta méthode actionPerformed2 n'existe que parce que tu l'as créée. Elle ne sera donc pas utilisée par les événements.

En fait, TOUS les événements affectés aux boutons passeront irrémédiablement par ta méthode actionPerformed. C'est d'ailleurs la raison pour laquelle tu ouvres une fenêtre de jeu à chaque clic sur n'importe quel bouton. Il te faut donc à chaque fois DISTINGUER sur quel bouton tu as cliqué.

Voici ce que tu dois obtenir:

public void actionPerformed(ActionEvent event) {

if(event.getSource() == jbPlay) {
// Tout ce qui concerne le bouton play
}

if(event.getSource() == jbClose) {
// Tout ce qui concerne le bouton close
}


J'ai deux questions :
1/ ta class Jeu (d'ailleurs, on débute TOUJOURS par convention le nom d'une classe par une majuscule) s'ouvre-t-elle dans la même fenêtre que le bouton qui le lance ou dans une fenêtre séparemment?
2/ ton bouton close, qu'est-il sensé fermer au juste? L'interface principale ou ton interface de jeu?
Ajouter un commentaire
Réponse
+0
moins plus
Alors, tout d'abord, merci, ma classe jeu s'ouvre dans une autre fenêtre que celle ci, par souci de praticité:

code classe jeu(qui d'ailleurs refuse d'afficher mon image):

import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import javax.swing.*;



public class jeu extends JFrame {

	JLabel fond;
    
	public jeu (String titre) {               
		setTitle (titre);
		Container contenu2 = getContentPane();


		contenu2.setLayout(null);
		JLabel fond = new JLabel();
		Image image = Toolkit.getDefaultToolkit().createImage("fond.gif");
		fond.setIcon(new ImageIcon(image));
		contenu2.add(fond);
		fond.setBounds(0, 0, 900, 800);
		    
	
		
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true); 
		}}

et je souhaite fermer la fenetre du menu, donc je ne sais pas si je doit mettre dispose(contenu); ou contenu.dispose(); car cela ne marche pas..
Ajouter un commentaire
Réponse
+0
moins plus
Premier point :
dispose() est une méthode de la classe JFrame.
getContentPane() ne renvoie pas la JFrame courante, mais le Pane associé par défaut à ta JFrame.

Second point :
D'un point de vue fonctionnel, il n'est pas utile de faire un bouton ferme, puisque la croix ferme l'application.

Après, si tu insistes :), tu peux créer un listener sur les fenêtres (du même principe que les boutons).
Dans ta JFrame, il faut implementer l'interface WindowListener (tout comme l'actionListener):
class Bidule extends JFrame implements ActionListener, WindowListener {

}


Ensuite, il faut ajouter un écouteur à ta JFrame, puis implémenter la méthode qui réalise les actions sur la fermeture des fenêtres :
this.addWindowListener(this);

public void windowClosing(WindowEvent event) {
     System.out.println("Fenêtre fermée");
     fermer();
}


On peut faire une méthode qui ferme la JFrame courante, à laquelle on fait appel (la méthode, pas la JFrame)
public void fermer() {
     dispose(); // Ferme la frame courante
}
Ajouter un commentaire
Réponse
+0
moins plus
huh? Pardon?

HUm, je ne comprend pas tout , bien que je comprenne l'idée générale, ce que je comprend moins, c'est pourquoi ce code ne marche pas...



		ActionListener play = null;  // la c'est bon j'initialise mon listener
		jbPlay.addActionListener(this);   //la je le place
		
		ActionListener close = null;  // pareil
	    jbClose.addActionListener(this);      // pareil
	
		setSize(907,832);   // taille de la fenetre, on s'en passe
		setResizable(false);     // pas important
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);   // normal
		setVisible(true);  // heuresement ^^
	
		
	}

	public void actionPerformed(ActionEvent event) {  // la on crée notre méthode qui récupère tout ce qui est lié aux action de l'utilisateur
		if(event.getSource() == jbPlay) {   // si l'action vient de lobjet jbplay
			System.out.print("jeuu");    // tu fais ca
		}

			if(event.getSource() == jbClose) {  // mais si ca vient de jbclose
			System.out.print("test");    // affiche ça !
			}
			
			}


public void jeu(){
jeu j = new jeu("Doode");	

}}




Tout m'a l'air bon!!! si mes petites notes sont fausses, c'est que je n'ai pas compris mon propre code o_O

Merci d'avance :
biboo_ - 28 oct 2009 à 10:12
Au fait, ça te met quoi comme erreur?
Ajouter un commentaire
Réponse
+0
moins plus
Cette portion du code :
ActionListener play = null;  // la c'est bon j'initialise mon listener
ActionListener close = null;  // pareil

ne sert absolument à rien.
Tes références pointent vers null et ne sont jamais utilisées.

Ne le prends pas mal mais si tu n'as pas compris ce que j'ai écrit, c'est que tu n'as pas compris jusqu'au bout l'utilisation des Listeners, et ça je ne peux pas faire grand chose. :/
Ajouter un commentaire
Réponse
+0
moins plus
La seule chose je ne comprend pas c'est la windows listener... Je veux que lorsqu'on clique sur mon autre bouton cela ferme la fenêtre, je n'ai pas compris pourquoi tu comptes mettre un écouteur sur la fenêtre elle même...



Et puis le truc, c'est que ca ne me met pas d'erreur...

Il ne se passe juste rien lors de mes clics sur mes boutons.

fin du code :

	public fenetre (String titre) {                 //création de la méthode constructeur
		setTitle (titre);
		Container contenu = getContentPane();

		JButton jbPlay = new JButton("", new ImageIcon("jouer.gif"));
		JButton jbClose = new JButton("", new ImageIcon("exit.gif"));

		jbPlay.setFocusPainted(false);
		jbPlay.setBorderPainted(false);                  // ces trois lignes enelvent la bordure du boutton
		jbPlay.setContentAreaFilled(false);

		jbClose.setFocusPainted(false);
		jbClose.setBorderPainted(false);               // ces trois lignes sont les meme que la haut :)
		jbClose.setContentAreaFilled(false);

		contenu.setLayout(null);
		JLabel label = new JLabel();
		Image image = Toolkit.getDefaultToolkit().createImage("background.gif");// nouveau JLabel backgound
		label.setIcon(new ImageIcon(image));

		contenu.add(jbPlay, 0);
		contenu.add(jbClose, 1);
		contenu.add(label, 2);
		label.setBounds(0, 0, 900, 800);
		jbPlay.setBounds(50, 445, 850, 78);
		jbClose.setBounds(50, 640, 158, 50);
		
		
		
		jbPlay.addActionListener(this); 
		
		
	    jbClose.addActionListener(this);      
	
		setSize(907,832);
		setResizable(false);
		setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
		setVisible(true);
	
		
	}

	public void actionPerformed(ActionEvent event) {
		if(event.getSource() == jbPlay) {
			System.out.print("jeuu");
		}

			if(event.getSource() == jbClose) {
			System.out.print("test"); 
			}
			
			}


public void jeu(){
jeu j = new jeu("Doode");	

}}
Ajouter un commentaire
Ce document intitulé « Java écouteurs » issu de CommentCaMarche (www.commentcamarche.net) est mis à disposition sous les termes de la licence Creative Commons. Vous pouvez copier, modifier des copies de cette page, dans les conditions fixées par la licence, tant que cette note apparaît clairement.
Dossier à la une
5 extensions si vous voulez revenir à l'ancien Facebook