logo Homepage
+  NewbieContest
|-+  Programmation» Langages compilés» [java] actionListener
Username:
Password:
Pages: [1]
  Imprimer  
Auteur Fil de discussion: [java] actionListener  (Lu 7398 fois)
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« le: 07 Novembre 2007 à 11:35:20 »

Hello all

Etant obligé de faire du java, je suis confronté à un probleme de Listener sur un bouton. Voila comment ca ce passe :
Code:
import java.awt.* ;
import java.awt.event.* ;

public class layout extends Frame implements ActionListener
{

public void main (String[]args)
{
// creation des objets graphiques
Frame f = new Frame ("BorderLayout") ;
Button b = new Button ("Quitter") ;
TextArea ta = new TextArea () ;

//mise en place des listeners
b.addActionListener(this) ;


//incrustation des objets
f.setLayout(new FlowLayout());
f.add ("North", ta);
f.add("South", b) ;
f.setSize (300, 300) ;
f.setBackground (Color.gray) ;
//construction de la fenetre
f.show() ;
}


// gestion des evenements
public void actionPerformed(ActionEvent evt)
{
Object obj = evt.getSource() ;
if (obj.equals(b))
{
// code quand on clique sur le bouton
}

}
}

Voila, j'ai donc un bouton b qui doit etre écouté, quaf que dans mon void actionPerformed, il ne reconnait pas b. Voila l'erreur :

cannot find symbol
symbol  : variable b
location: class layout
                if (obj.equals(b))
                                  ^

Je bloque depuis ce matin dessus, et le java n'etant pas dans mon top3 des favoris, ca me gave plutot qu'autre chose...

Si quelqu'un a une solution, une explication, une idée ou meme 1000 euros a me donner, ca m'arrangerait !

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Chilly
Relecteur

Profil challenge

Classement : 266/54371

Membre Senior
*
Hors ligne Hors ligne
Messages: 307


Voir le profil
« #1 le: 07 Novembre 2007 à 13:10:08 »

Si tu veux utiliser une variable dans une méthode il faudrait peut être la passer en paramètre...
Journalisée

Non au langage SMS !!! http://sms.informatiquefrance.com
Al3x
Profil challenge

Classement : 1109/54371

Membre Junior
**
Hors ligne Hors ligne
Messages: 54


Voir le profil
« #2 le: 07 Novembre 2007 à 13:24:26 »

Voilà comment doit être ton code :

Code:
import java.awt.* ;
import java.awt.event.* ;

public class layout extends Frame implements ActionListener
{

public void main (String[]args)
{
// creation des objets graphiques
Frame f = new Frame ("BorderLayout") ;
Button b = new Button ("Quitter") ;
TextArea ta = new TextArea () ;

//mise en place des listeners
b.setActionCommand("wahoo"); //On donne un nom à l'action
b.addActionListener(this) ;

//incrustation des objets
f.setLayout(new FlowLayout());
f.add ("North", ta);
f.add("South", b) ;
f.setSize (300, 300) ;
f.setBackground (Color.gray) ;
//construction de la fenetre
f.show() ;
}


// gestion des evenements
public void actionPerformed(ActionEvent evt)
{
Object obj = evt.getSource() ;
if (obj.equals("wahoo"))
{
// code quand on clique sur le bouton
}

}
}
Journalisée
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #3 le: 12 Novembre 2007 à 08:54:13 »

Re

J'ai essayé en rajoutant ce que tu m'a dis Al3x, ca me fait une erreur Exept in thread "main" java.lang.NoSuchMethodError: main


Chilly ??? Moi y en a pas tout comprendre en java... Pourquoi je devrais la passer en paramètre, et surtout, comment ?

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Spaulding

Profil challenge

Classement : 8/54371

Membre Complet
***
Hors ligne Hors ligne
Messages: 190


Voir le profil WWW
« #4 le: 12 Novembre 2007 à 10:14:00 »

J'ai essayé en rajoutant ce que tu m'a dis Al3x, ca me fait une erreur Exept in thread "main" java.lang.NoSuchMethodError: main


Essaye peut-être un public static void main.

Chilly ??? Moi y en a pas tout comprendre en java... Pourquoi je devrais la passer en paramètre, et surtout, comment ?
Oh c'est pas vraiment spécifique à Java, les variables globales, locales, tout ça...
Journalisée

---------------
_o_
Relecteur

Profil challenge

Classement : 42/54371

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #5 le: 12 Novembre 2007 à 14:07:35 »

Oh c'est pas vraiment spécifique à Java, les variables globales, locales, tout ça...

Ohlalala, pourquoi se compliquer la vie ? Moi, je mets tout en global, c'est vachement plus simple.
(http://forum.hardware.fr/images/perso/implosion%20du%20tibia.gif)
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #6 le: 12 Novembre 2007 à 14:28:24 »

A la base, le static était mis, mais justement je l'ai enlevé à cause de cette erreur

C:\layout.java:16: non-static variable this cannot be referenced from a static context
    b.addActionListener(this) ;

Pour ce qui est des variables locales, globales, j'ai pas tout callé (bon faut dire que la prof qui nous fait cours ne sait meme pas résoudre mon problème, alors je vais pas lui demander si elle sait passer des paramètres...)

Je vais me renseigner sur les parmaètres tout ca tout ca pour l'instant

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
_o_
Relecteur

Profil challenge

Classement : 42/54371

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #7 le: 12 Novembre 2007 à 15:11:07 »

A la base, le static était mis, mais justement je l'ai enlevé à cause de cette erreur

C:\layout.java:16: non-static variable this cannot be referenced from a static context
    b.addActionListener(this) ;


C'est normal. La réponse d'Al3x tenait la route, sauf qu'il a conservé l'architecture de départ, où tout est créé dans le main, ce qui est mal. Ça fait un moment que je n'ai pas touché à awt, mais si je me souviens bien, la bonne manière de faire est de :
- créer une classe layout comme tu l'as fait (mais franchement, le nom est très mal trouvé, Layout, ça existe en Java, et les noms de classe commencent par convention par une majuscule).
- définir la méthode de création de l'interface graphique, sous je ne sais plus quel nom (en gros, c'est renommer le main() actuel).
- implémenter un main qui ne fait qu'instancier un objet de type layout et l'"exécuter" (i.e. l'afficher et le laisser réagir aux stimuli).

C'est résumé (et assez flou dans ma tête, maintenant), mais normalement, tu dois trouver facilement la (bonne) manière de faire en consultant des tuto sur awt. Attention, la tendance depuis des années est d'utiliser plutôt swing (do not feed the troll  ! ).

Et garder sous la main : http://java.sun.com/docs/books/tutorial/
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #8 le: 12 Novembre 2007 à 15:15:36 »

Bon avec tout ca, si je n'y arrive pas...

En l'occurence, j'ai remarqué moi meme que tout était dans le main avant que tu poste, donc ca fait un point en moins.

A propos du awt/swing j'ai remarqué que awt avait tendance a ne pas etre au gout du jour, mais on en revient à ma prof qui n'est pas non plus au gout du jour...

Merci pour les conseils

Enjoy

The lsd

Edit : avec un petit mélange des conseils de _o_ et de ceux d'al3x, j'ai réussi a faire marcher le bignou, bon il reste encore des choses très obscures dans ce code, mais ca va venir...

Edit 2 : bon il se lance, mais en fait il listen rien du tout ! Pqs grave je vais trouver !
« Dernière édition: 12 Novembre 2007 à 15:29:49 par the lsd » Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Al3x
Profil challenge

Classement : 1109/54371

Membre Junior
**
Hors ligne Hors ligne
Messages: 54


Voir le profil
« #9 le: 12 Novembre 2007 à 19:25:26 »

Code:
public class PanelBoutonsFP extends JPanel implements ActionListener{
private JButton btnGererEnvois = new JButton ("Gerer les envois");
private JButton btnEnregistrerRetour = new JButton ("Enregistrer un retour");
private JButton     btnListerRetards = new JButton("Lister les retards");
private JButton     btnAjouterExemplaire = new JButton("Ajouter un exemplaire");
private JButton     btnSupprimerExemplaire = new JButton("Supprimer un exemplaire");
private GestionVideotheque gestion = null;

/**
* Constructeur du panel contenant les boutons de la fenêtre principale lorsque la
* connexion est établie.
*
* @param gv Instance de GestionVideotheque permettant d'effectuer diverses actions.
*/
public PanelBoutonsFP(GestionVideotheque gv ){
gestion = gv;
GridLayout g = new GridLayout(5, 1);
setLayout(g);
setBorder(BorderFactory.createEmptyBorder (200, 300, 200, 300));

/* On définit les noms des évenements lancés par les boutons lorsqu'on clique dessus */
btnAjouterExemplaire.setActionCommand("Ajouter");
btnEnregistrerRetour.setActionCommand("Rendre");
btnGererEnvois.setActionCommand("Gerer");
btnListerRetards.setActionCommand("Lister");
btnSupprimerExemplaire.setActionCommand("Supprimer");

/*On demande au panel de gérer lui même les évenements qui sont provoqués par ses éléments*/
btnAjouterExemplaire.addActionListener(this);
btnEnregistrerRetour.addActionListener(this);
btnGererEnvois.addActionListener(this);
btnListerRetards.addActionListener(this);
btnSupprimerExemplaire.addActionListener(this);

/* Ajout des différents composants */
add(btnAjouterExemplaire);
add(btnEnregistrerRetour);
add(btnGererEnvois);
add(btnListerRetards);
add(btnSupprimerExemplaire);

}


/**
 * Gestion des événements se passant dans le panel
 */
public void actionPerformed(ActionEvent action) {
String cause = action.getActionCommand();

if (cause.equals("Ajouter")) {
FenetreAjout f = new FenetreAjout(gestion);

}
if (cause.equals("Rendre")) {
try {
FenetreRetour f = new FenetreRetour(gestion);
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Impossible de se connecter à la Base de données", "Erreur", JOptionPane.ERROR_MESSAGE);
}

}
if (cause.equals("Gerer")) {
try {
FenetreEnvoi f = new FenetreEnvoi(gestion);
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Impossible de se connecter à la Base de données", "Erreur", JOptionPane.ERROR_MESSAGE);
}

}
if (cause.equals("Lister")) {
try {
gestion.DelaiEmpruntDepasse();
} catch (SQLException e) {
JOptionPane.showMessageDialog(this, "Impossible de se connecter à la Base de données", "Erreur", JOptionPane.ERROR_MESSAGE);
} catch (IOException e) {
JOptionPane.showMessageDialog(this, "Problème lors de la création du fichier", "Erreur", JOptionPane.ERROR_MESSAGE);
}
}
if (cause.equals("Supprimer")) {
FenetreSupprimer f = new FenetreSupprimer(gestion);

}
}

}

C'est une classe qui constituait une partie d'un projet que j'avais fait il y a quelques temps. Ca marche donc ça devrait t'aider ^^
Journalisée
Nebelmann

Profil challenge

Classement : 464/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 1357


Voir le profil
« #10 le: 13 Novembre 2007 à 20:55:46 »

En fait il faut pas tout mettre dans le main... juste un appel au constructeur dans l'idéal

Voici ton code qui marche : http://pastebin.com/f5b4c2de9

Le main doit toujours être en static, tu mets en variable membre de la classe tout ce que tu seras amené à utiliser dans diverses fonctions (en général tous tes composants graphiques). Des IDE comme Netbeans font ça automatiquement (mais on nous apprend à coder avec des éditeurs simples, donc faut tout faire à la mimine ^^)

EDIT: [20:58] <Chilly> on fout pas n'importe quoi en attribut d'une classe aussi
« Dernière édition: 13 Novembre 2007 à 21:00:35 par Nebelmann » Journalisée

-- Nebelmann -- Registered linux user #429186
«Si les lecteurs étaient des compilateurs, les posteurs feraient peut-être davantage attention à ce qu'ils écrivent...»
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #11 le: 15 Novembre 2007 à 10:20:44 »

ok ca marche impec, merci Nebel (et les autres aussi quand meme ^^)

Par contre, je ne vois pas l'interet de mettre ton Button en private, un public est aussi bien non ?

Enjoy

The lsd
Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
_o_
Relecteur

Profil challenge

Classement : 42/54371

Membre Héroïque
*
Hors ligne Hors ligne
Messages: 1258


Voir le profil
« #12 le: 15 Novembre 2007 à 10:33:49 »

Par contre, je ne vois pas l'interet de mettre ton Button en private, un public est aussi bien non ?

Question de conception. As-tu envie qu'une autre classe vienne faire joujou avec le bouton sans te demander ton avis ? Je ne le crois pas. Ou alors, c'est que l'ihm est mal pensée au départ.

Personnellement, je le mettrais en protected, ce que je fais pour la majorité des attributs en général. Interdiction d'y accéder directement (sauf si je mets un sélecteur public à disposition), sauf pour les classes filles. C'est en général un bon compromis.
Journalisée

Les épreuves de hack de NC sont trop faciles ? Et pourtant ! Bienvenue dans la vraie vie : http://thedailywtf.com/Articles/So-You-Hacked-Our-Site!.aspx
the lsd
Administrateur

Profil challenge

Classement : 190/54371

Membre Héroïque
*****
Hors ligne Hors ligne
Messages: 3096

poulping for fun & profit


Voir le profil WWW
« #13 le: 15 Novembre 2007 à 10:50:28 »

Ok c'est bien ce que je pensais, merci de l'info 

Now, direction la gestion de fichiers !

Enjoy

The lsd

Edit : Y a t'il un moyen simple de de faire des arborescences avec awt ?
« Dernière édition: 15 Novembre 2007 à 12:30:17 par the lsd » Journalisée

Newbie Contest Staff :
The lsd - Th3_l5D (IRC)
Statut :
Administrateur
Citation :
Cartésien désabusé : je pense, donc je suis, mais je m'en fous !
Pages: [1]
  Imprimer  
 
Aller à: