Java écouteurs

Fermé
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 - 27 oct. 2009 à 10:58
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 - 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 !!!");
	}}
A voir également:

10 réponses

biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
27 oct. 2009 à 12:04
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).
1
biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
27 oct. 2009 à 11:27
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); 
0
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 4
27 oct. 2009 à 11:59
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...
0
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 4
27 oct. 2009 à 12:30
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");
		
	}}

0

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

Posez votre question
biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
27 oct. 2009 à 13:33
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?
0
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 4
27 oct. 2009 à 14:07
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..
0
biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
27 oct. 2009 à 14:39
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
}
0
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 4
27 oct. 2009 à 19:19
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 :
0
biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
28 oct. 2009 à 10:12
Au fait, ça te met quoi comme erreur?
0
biboo_ Messages postés 1249 Date d'inscription jeudi 20 août 2009 Statut Membre Dernière intervention 14 mars 2012 106
28 oct. 2009 à 09:48
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. :/
0
hugo0x Messages postés 17 Date d'inscription mardi 27 octobre 2009 Statut Membre Dernière intervention 29 octobre 2009 4
28 oct. 2009 à 13:39
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");	

}}
0