Probléme d'interraction avec un boutton ...

Probléme d'interraction avec un boutton ... - Java - Programmation

Marsh Posté le 25-12-2005 à 16:04:39    

Bonjour , alors mon soucis et que j'aimerais afficher une forme ovale a la suite d'un clic sur un boutton , mais quand j'exécute mon programme (qui est en faite une Applet s'exécutant de la classe Environnement) cela me crée des exceptions.  
Voici mes différentes classes:
 
 
1er classe:

Code :
  1. import java.applet.*;
  2. import java.awt.*;
  3. public class Environnement extends Applet {
  4. static Graphics g;
  5. static Maframe f = new Maframe(g);
  6. static MonApplet a = new MonApplet();
  7.  public void paint(Graphics g)
  8. {
  9.   super.init();
  10.   super.paint(g);
  11.   resize(400,500);
  12.  a.paint(g);
  13. }
  14. static public void paint2() {
  15.   a.paint2(g);
  16.  }
  17. }


 
2e Classe:
 

Code :
  1. import java.awt.*;
  2. public class MonApplet extends Canvas {
  3.  
  4.   public void paint(Graphics g) {
  5.    super.paint(g);   
  6.    g.setColor(Color.black);
  7.    g.drawOval(30,150,20,20);
  8.     }
  9.  
  10.   public void paint2(Graphics g) {
  11.  
  12.    g.setColor(Color.black);
  13.    g.fillOval(60,150,20,20);
  14.      repaint();
  15.   }
  16.  
  17. }


3e Classe:
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class Maframe extends Frame implements ActionListener{
  4. public Maframe( Graphics g) {
  5.      super();
  6.  
  7.      Button b1=new Button("Valider" );   // Validation du choix des couleurs
  8.      b1.addActionListener(this);
  9.      add(b1);
  10.      show();
  11. }
  12. public void actionPerformed (ActionEvent evt) {
  13.   String boutton=evt.getActionCommand();
  14.   if (boutton=="Valider" ) {
  15.    Environnement.paint2();
  16.   }
  17. }
  18. }


 
 
 
Les exceptions que j'obtient lors du clic sur le boutton sont:
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException
 at MonApplet.paint2(MonApplet.java:14)
 at Environnement.paint2(Environnement.java:23)
 at Maframe.actionPerformed(Maframe.java:20)
 at java.awt.Button.processActionEvent(Button.java:388)
 at java.awt.Button.processEvent(Button.java:356)
 at java.awt.Component.dispatchEventImpl(Component.java:3955)
 at java.awt.Component.dispatchEvent(Component.java:3803)
 at java.awt.EventQueue.dispatchEvent(EventQueue.java:463)
 at java.awt.EventDispatchThread.pumpOneEventForHierarchy(EventDispatchThread.java:242)
 at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:163)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:157)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:149)
 at java.awt.EventDispatchThread.run(EventDispatchThread.java:110)
 
Ce que je ne comprend pas , c'est que si je demande a afficher quelque chose a l'écran par l'intémédiaire de System.out.println(".." ); lors d'un clic sur le boutton cela s'affiche , donc le programme détecte bien l'événement sur ce boutton mais refuse donc d'afficher une seconde forme ovale pour une raison qui m'échappe ...
 
Des idées ???
 
Merci d'avance


Message édité par hostile4 le 26-12-2005 à 12:32:46
Reply

Marsh Posté le 25-12-2005 à 16:04:39   

Reply

Marsh Posté le 26-12-2005 à 00:16:39    

modifies ton message en mettant le code de chacune de tes classes dans un [code ][/code] ca sera + facile pour se repérer par rapport aux lignes où ont lieu tes exceptions


Message édité par trevor le 26-12-2005 à 00:22:54
Reply

Marsh Posté le 26-12-2005 à 10:26:45    

Voila , c'est fait

Reply

Marsh Posté le 26-12-2005 à 11:23:08    

tu as donné tout le code ? car le compilateur fait référence à des lignes du code de tes classes qui n'existe pas... du coup j'arrive pas à voir où le NullPointerException est déclenché
 
ps: cette méthode de gestion des événement, c'est l'ancienne méthode je crois. c'est pas tiptop et un peu galère (mais je ne crois pas que ton pb vienne de là)


Message édité par trevor le 26-12-2005 à 11:23:58

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 26-12-2005 à 11:36:48    

Oui j'ai donné tout le code , les autres classes auquel le compilateur fait référence sont des classes que j'importe, il n'y a pas de main() puisqu'il s'agit d'une applet.
Sinon pour la méthode de gestion des événements , c'est celle que j'ai vu en cours , et donc je pensais pouvoir la ré-utiliser bétement...
 
Je pense avoir compris que dans la méthode paint2 de la classe MonApplet , la variable g a soucis d'initialisation , car si je place uniquement dans cette méthode l'instruction System.out.println("Action sur le boutton détecté" ); , le programme s'exécute sans soucis.
Mais je ne vois pas comment faire comprendre au programme que je veux modifier l'objet graphics initiale (puisque j'ai utiliser le mot clés static pour définir la variable g , mais apparament sans succés)...
 
Merci pour votre aide


Message édité par hostile4 le 26-12-2005 à 11:37:34
Reply

Marsh Posté le 26-12-2005 à 12:23:52    

ouais ok pour le main(), je sais. je ne prendrais pas la peine de te répondre si je ne connaissais pas un peu
 
cependant, lorsque je lis:
Exception in thread "AWT-EventQueue-1" java.lang.NullPointerException  
 at MonApplet.paint2(MonApplet.java:30)
je suis désolé, mais je ne vois pas de ligne 30 dans la classe MonApplet


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 26-12-2005 à 12:35:16    

Ah oui désoler j'ai merdé , lorsque j'exécuter le prog avec éclipse , j'avais laisser les lignes de commentaires qu'éclipse m'affiche automatiquement .... ce qui modifie les numéro des lignes ..... mais voila j'ai rétablis dans mon 1er message.
 
 

Reply

Marsh Posté le 26-12-2005 à 16:25:26    

bon, ton pb semble venir du g.setColor() dans la méthode paint2().
très certainement ton objet g ne doit pas être initialisé correctement, fait un if (g==null) System.out.println("g non-initialisé" ); avant le setColor() et vois si effectivement g n'est pas correctement instancié


Message édité par trevor le 26-12-2005 à 16:25:44

---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 26-12-2005 à 16:53:57    

Exact , c'est bien ca le probléme , merci.
Lorsque je clique sur le bouton , le message "g non-initialisé" s'affiche bien à l'écran.
 
Mais maintenant comment faire comprendre au programme que j'utilise toujours la méme variable g ? ... celle qui m'a permis d'exécuter la méthode paint() de la classe MonApplet ... je pensais qu'en déclarant g comme étant static cela réglé le pb ...là je vois pas.

Reply

Marsh Posté le 26-12-2005 à 17:26:01    

essaye sans le "static" justement. d'ailleurs, je n'ai pas vraiment compris pourquoi tes attributs de Environnement sont déclarés statiques... que voulais-tu faire ?
 
ps: ça n'est pas très logique de faire une sous-classe de Applet qui s'appeller Environnement, et une sous-classe de Canvas qui s'appelle MonApplet... c'est ta classe dérivée de Applet qui devrait s'appeller MonApplet


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 26-12-2005 à 17:26:01   

Reply

Marsh Posté le 26-12-2005 à 17:56:09    

Pour les noms des classes , c'est n'importe quoi je sais , c'est parce qu'a la base je pensais arriver a créer des boutton , des barres de choix ainsi que des figures géométrique dans une classe héritant de la classe Applet ....  mais j'ai pas réussi et alors j'ai créer des classe sans faire attention a leurs noms.
 
Pour les static , ben ca vient du fait que je voulais depuis la classe Maframe appeller une méthode de la classe MonApplet (faire apparaitre une seconde forme ovale aprés un click sur le boutton) , et pour cela j'ai trouver de mieux que de passer par une méthode de ma classe Environnement qui devait étre static vu la facon dont je l'appellais.... d'ailleurs maintenant que j'ai enlever le mot clés static pour les variables et la méthodes paint2() de la classe Environnement , je ne sais plus comment faire pour exécuter cette classe depuis ma classe Maframe aprés un click sur le boutton (soit depuis sa méthode  actionPerformed())...
 
 
Voici les nouveaux codes de mes classes:
 

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. public class Maframe extends Frame implements ActionListener{
  4. public Maframe( Graphics g) {
  5.      super();
  6.      Button b1=new Button("Valider" );   // Validation du choix des couleurs
  7.      b1.addActionListener(this);
  8.      add(b1);
  9.      show();
  10. }
  11. public void actionPerformed (ActionEvent evt) {
  12.   String boutton=evt.getActionCommand();
  13.   if (boutton=="Valider" ) {
  14.    // Comment appeller la fonction paint2() de la classe Environnement voir de la classe MonApplet
  15.   }
  16. }
  17. }


 

Code :
  1. import java.awt.*;
  2. public class MonApplet extends Canvas {
  3.  
  4.   public void paint(Graphics g) {
  5.    super.paint(g);   
  6.    g.setColor(Color.black);
  7.    g.drawOval(30,150,20,20);
  8.     }
  9.  
  10. public void paint2(Graphics g) {
  11.  
  12.    if ( g==null)
  13.    {System.out.println("g non-initialisé" );}
  14.    else {
  15.     g.setColor(Color.BLACK);
  16.     g.fillOval(60,150,20,20);
  17.     repaint();
  18.   }}
  19.  
  20. }


 

Code :
  1. import java.applet.*;
  2. import java.awt.*;
  3. public class Environnement extends Applet {
  4.  Graphics g;
  5.  Maframe f = new Maframe(g);
  6.  MonApplet a = new MonApplet();
  7.  public void paint(Graphics g)
  8. {
  9.   super.init();
  10.   super.paint(g);
  11.   resize(400,500);
  12.  a.paint(g);
  13. }
  14. public void paint2() {
  15.  a.paint2(g);
  16.  }
  17. }


 
Donc voila a tu une solution pour appeller la méthode paint2() de la classe Environnement aprés un click sur le boutton ?? .... merci bcp pour ton aide
 
 
 
J'ai oublier de préciser que si je crée un objet de type Environnement pour m'en servir afin d'appeller la méthode paint2() , un click sur le boutton fera ouvrir une autre fenétre comportant ce méme boutton etc....  donc voila , je vois pas du tout.


Message édité par hostile4 le 26-12-2005 à 17:58:28
Reply

Marsh Posté le 26-12-2005 à 19:01:07    

L'un des seuls intérêts d'une méthode statique (à ma connaissance), qui se base sur la définition de "static" c'est de faire une méthode qui s'apparente plus à une fonction. Je fais des méthodes statiques sur des classes fourre-tout type "boîte-à-outils", parce que j'ai juste besoin de faire passer un objet par diverses manipulations. donc ça sert pas à gdchose d'instancier spécifiquement un objet pour ça.
bon ça sert aussi pour effectuer des instanciations spécifiques (genre un singleton ou autres)
Pour les attributs, l'intérêt réside dans le fait de conserver la valeur entre 2 instanciations différentes: pratique pour mémoriser la valeur ou bien pour "passer" un attribut qcque pdt une récursivité
 


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 26-12-2005 à 20:14:31    

Sans vouloir faire chier, je crois qu'il faut que tu reprennes tout depuis le début...
en effet, pourquoi avoir une frame, vu que tu as deja une applet. une applet est une application graphique, sauf qu'elle s'exécute avec la jvm du navigateur, et pas la jvm de l'os
donc, tu peux très facilement insérer n'importe quel élément graphique
 
je te donne le bout d'une applet que j'ai développée (et qui fonctionne bien sûr ;)) :

Code :
  1. import java.awt.*;
  2. import java.awt.event.*;
  3. import javax.swing.*;
  4. import java.applet.*;
  5. public class BiblioApplet extends Applet {
  6.   private JPanel jPanelControls = new JPanel();
  7.   private JPanel jPanelParameters = new JPanel();
  8.   private JTextField jTextFieldServerIP = new JTextField();
  9.   private JTextField jTextFieldName = new JTextField();
  10.   public void init() {
  11.     try {jbInit();}
  12.     catch(Exception e) {e.printStackTrace();}
  13.     this.setSize(400, 260);
  14.   }
  15.   private void jbInit() throws Exception {
  16.     this.setLayout(new BorderLayout());
  17.     this.add(jPanelControls, BorderLayout.CENTER);
  18.     jPanelControls.setLayout(new GridLayout(1, 2));
  19.     jPanelControls.add(jPanelParameters, null);
  20.     jPanelParameters.setLayout(new VerticalFlowLayout());
  21.     jPanelParameters.add(jTextFieldServerIP, null);
  22.     jPanelParameters.add(jTextFieldName, null);
  23.   }
  24.   ...
  25. }


---------------
TReVoR - http://dev.arqendra.net - http://info.arqendra.net
Reply

Marsh Posté le 27-12-2005 à 19:13:34    

Merci bcp pour ton aide et je vais suivre ton conseil , je vais tout recommencer juste avec une Applet.

Reply

Sujets relatifs:

Leave a Replay

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