Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1670 connectés 

  FORUM HardWare.fr
  Programmation
  Java

  [RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas

n°1922335
Yop69
Posté le 08-09-2009 à 21:02:16  profilanswer
 

Bonsoir,
 
Voila je me mets au Java que j'aime beaucoup pour sa syntaxte. Malheureusement je tombe sur 2 bugs super genant (ca doit être moi le bug  :o )
 
Déjà, quand je fais mon HelloWorld \o/ j'utilise le nom de la classe que je veux. Je peux mettre pouet, il ne rale pas à la compile.
Par contre si j'utilise un code qui fait exactement la même chose, et que je mets pas le nom du fichier pour le nom de la classe il rale à la compile !!
 
Ensuite, 2ème soucis : j'ai ma fenêtre JFrame je compile, j'éxecute et niquel ca marche, je peux fermer la fenêtre correctement.
Je relance l'exécution du code, et la, la fenetre JFrame se grise et je ne peux que Killer cette fenêtre et non la fermer proprement :(
 
Voici le code du fichier HelloJava.java pour lequel je suis obligé de mettre le nom de ma classe principale comme le nom de mon fichier (alors qu'un autre code identique, ce n'est pas le cas du tout  :heink: )

Code :
  1. import javax.swing.JFrame;
  2. import java.awt.event.*;
  3. public class HelloJava {
  4.   public static void main(String[] args) {
  5.     MaFenetre f = new MaFenetre();
  6.     f.afficher();
  7.   }
  8.  
  9. }
  10. class MaFenetre {
  11.   JFrame mainFrame = null;
  12.   public MaFenetre() {
  13.     mainFrame = new JFrame();
  14.     mainFrame.setTitle("Mon application" );
  15.     mainFrame.addWindowListener(new WindowAdapter() {
  16.       public void windowClosing(WindowEvent ev) {
  17.         System.exit(0);
  18.       }
  19.     });
  20.     mainFrame.setSize(320, 240);
  21.   }
  22.   public void afficher() {
  23.     mainFrame.setVisible(true);
  24.   }
  25. }


 
Merci beaucoup pour votre aide !  :bounce:


Message édité par Yop69 le 11-09-2009 à 00:11:03
mood
Publicité
Posté le 08-09-2009 à 21:02:16  profilanswer
 

n°1922397
cbeyls
Hail to the King, Baby
Posté le 09-09-2009 à 03:10:16  profilanswer
 

Bienvenue dans le monde merveilleux du Java ;)
 
Alors voici quelques remarques:
 
1) Par convention en Java, chaque fichier contient une seule classe, et le nom de la classe doit correspondre au nom du fichier. Ceci n'est pas obligatoire mais de nombreux IDE dont Eclipse râlent si tu ne le fais pas. Par contre, tu peux déclarer une ou plusieurs classes à l'intérieur de la classe principale (on appelle ça une inner Class ou classe interne) afin d'éviter d'avoir à créer deux fichiers pour ton exemple. Ici tu as mis une classe à la suite d'une autre, ce qui techniquement fonctionne, mais je te conseille de la mettre à l'intérieur de la classe principale HelloJava ou de la mettre dans un fichier séparé MaFenetre.java .
 
2) Ta classe MaFenetre encapsule une JFrame. D'après ton code, ce n'est rien d'autre qu'une JFrame spécialisée. Je te conseille donc non pas de déclarer une JFrame à l'intérieur de cette classe, mais de déclarer MaFenetre comme une classe qui étend JFrame. Dans le constructeur de MaFenetre, tu fais la même chose, mais tu appelles les méthodes sur toi-même au lieu de les appeler sur un objet mainFrame.
 
3) Ton appel à System.exit(0) est un peu brutal. En effet, cela a pour effet de stopper immédiatement toute activité de la machine virtuelle Java. C'est ce qu'on doit faire au dernier moment, quand la fenêtre est fermée (onWindowClosed). Or tu le fais dans onWindowClosing qui est appelé lorsque l'utilisateur clique sur la croix pour tenter de fermer la fenêtre mais celle-ci est toujours visible. Je laisserais donc d'abord le système fermer proprement la fenêtre avant de "tuer" le programme.
 
4) Même si ta méthode qui consiste à créer et enregistrer un WindowAdapter afin de fermer l'application lorsqu'on ferme la fenêtre est correcte (si tu fermes l'application dans onWindowClosed et pas dans onWindowClosing comme expliqué juste avant), il existe une façon plus simple et propre d'arriver au même résultat: appeler setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE) dans le constructeur de la fenêtre.
 
5) Tu peux appeler le constructeur vide de JFrame et ensuite appeler la méthode setTitle() pour définir le titre de la fenêtre ou tu peux directement passer le titre de la fenêtre en tant que paramètre au constructeur comme je le fais dans l'exemple suivant.
 
Voilà ce que ça donne:
 

Code :
  1. import javax.swing.JFrame;
  2.  
  3. public class HelloJava {
  4.  
  5.     static class MaFenetre extends JFrame {
  6.  
  7.         private static final long serialVersionUID = 1L;
  8.         
  9.         public MaFenetre() {
  10.             super("Mon application" );
  11.             setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  12.             setSize(320, 240);
  13.         }
  14.         
  15.         public void afficher() {
  16.             setVisible(true);
  17.         }
  18.     }
  19.     
  20.     public static void main(String[] args) {
  21.         MaFenetre f = new MaFenetre();
  22.         f.afficher();
  23.     }
  24. }


 
On pourrait également faire de MaFenetre la classe principale et se passer d'une classe interne puisque la classe principale HelloJava ne fait rien à part lancer le programme. Cela rend le code encore plus court:
 

Code :
  1. import javax.swing.JFrame;
  2.  
  3. public class MaFenetre extends JFrame {
  4.  
  5.     private static final long serialVersionUID = 1L;
  6.  
  7.     public MaFenetre() {
  8.         super("Mon application" );
  9.         setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  10.         setSize(320, 240);
  11.     }
  12.  
  13.     public void afficher() {
  14.         setVisible(true);
  15.     }
  16.  
  17.     public static void main(String[] args) {
  18.         MaFenetre f = new MaFenetre();
  19.         f.afficher();
  20.     }
  21. }


Message édité par cbeyls le 09-09-2009 à 15:17:03
n°1922399
Yop69
Posté le 09-09-2009 à 04:23:21  profilanswer
 

Bon dieu de bon dieu !  :love:  
Si je m'attendais à une telle réponse !! merci c'est super gentil à toi ! j'ai copié ton code et ça fonctionne à merveille  :love:  
 
Quelques questions :  
 
1) concernant la convention ok, je m'y attacherais.
 
2) à quoi sert private static final long serialVersionUID = 1L;  [:zaib3k]  
 
3) Java (jvm ?) va chercher directement la fonction main dans la classe HelloJava. Comment cela se passe concretement.
 
4) Sais tu pourquoi (ca me tarabuste) pourquoi avant dans mon prog, quand je l'exécutais, un coup je fermais la JFrame niquel, un autre la fanêtre se grisait et l'application devait être Killée  :na:  
De plus, pourquoi je pouvais mettre un nom de classe différent de mon nom de fichier il ne gueulait pas alors qu'avec le code que j'ai donné il gueulait  :(. Ca me parait sortir de la science fiction ces bugs et j'ai horreur de ça (en tout cas ton post j'en reviens toujours pas, il m'éclaire super  :bounce: )
 
5) une dernière petite chose ; j'aime beaucoup Java pour sa notion d'objet et j'aimerais donner des cours débutant/moyen (j'ai encore du chemin mais je vais m'y mettre, faire une doc et faire des exercices) connais tu un pdf/site incontournable ? (si pas spécialement t'inquiete pas j'ai deja pas mal de sources ;) )


Message édité par Yop69 le 09-09-2009 à 04:31:01
n°1922400
Yop69
Posté le 09-09-2009 à 04:34:57  profilanswer
 

arggggg (je te laisse répondre d'abord à toutes mes questions lol)
Je viens de démarrerEclipse, j'ai lancé l'exécution et la bing c'est pareil qu'avant, la fenêtre JFrame ne se ferme plus. Elle se grise et faut la killer. Je retourne sous mon Geany en mode console qui marchait très bien et pareil ! la fenêtre se grise !
Je pense qu'il y a un mécanisme en mémoire qui bloque quelque chose mais je ne vois pas quoi :(
 


Message édité par Yop69 le 09-09-2009 à 05:18:13
n°1922598
cbeyls
Hail to the King, Baby
Posté le 09-09-2009 à 15:08:19  profilanswer
 

Salut Yop69,
 
En copiant ton code précédent ma fenêtre ne se grise jamais donc je n'ai aucune idée... grand mystère. Ca ne devrait pas planter à l'ouverture de la fenêtre en tous les cas. Essaye de réinstaller le dernier JDK et Eclipse. Prend la version la plus compacte: "Eclipse IDE for Java Developers" (moins de 100 Mo).
 

Code :
  1. private static final long serialVersionUID = 1L;


 
Cette ligne est optionnelle, c'est surtout pour empêcher un warning dans Eclipse dans sa config par défaut (on peut désactiver ce warning si on veut en fouillant dans les options). En fait lorsque tu déclares une nouvelle classe qui implémente Serializable, tu es invité à lui donnée un numéro de version à l'aide de cette ligne afin que lorsque tu fais évoluer ta classe à l'avenir et que les anciennes données de sérialisation ne sont plus compatibles avec les nouvelles, tu puisses augmenter le numéro de version. Comme ça Java détecte les incompatibilités de sérialisation à l'avance. Le numéro de version par défaut est 1L. Ici MaFenetre implémente Serializable parce que JFrame l'implémente et MaFenetre est une extension de JFrame.
 
Lors de l'exécution, tu dois seulement donner un nom de classe à Java (nom complet, package inclus si package il y a) et là il recherche une méthode avec la signature: public static void main(String[] args) et la lance. C'est tout.
Si tu crées une archive jar, tu peux aussi indiquer dans le fichier MANIFEST.MF la classe principale à lancer via la ligne Main-Class: xxx . Dans ce cas tu donnes juste le fichier jar en paramètre à la JVM et l'application se lance: java -jar monfichier.jar
 
Apparemment Eclipse n'est pas content quand la première classe déclarée dans un fichier n'a pas le même nom que le fichier. Je n'ai pas fait de tests approfondis là-dessus, de toutes façons je mets toujours une classe par fichier... Quand je veux renommer ma classe je fais refactor > rename et Eclipse renomme automatiquement ma classe ET son fichier ainsi que toutes les références à celles-ci.
 
Non je ne connais pas de site incontournable à part le site où on peut consulter la Javadoc (RTFM comme on dit), j'ai tout appris durant mes études. Si tu veux un bon bouquin pour débuter, je te conseille la collection O'reilly ou encore "Tête la première" (des livres complètement barjes qui expliquent bien).

n°1922829
Yop69
Posté le 10-09-2009 à 09:03:48  profilanswer
 

Super merci pour tes explications. Concernant mon bug, j'ai réinstallé Eclipse sans trop y croire.
J'ai aussi le bug en ligne de commande donc... :/
 
Je suis un peu dég car je ne peux tester correctement Java avec ca :'(

n°1922928
cbeyls
Hail to the King, Baby
Posté le 10-09-2009 à 12:57:11  profilanswer
 

Alors essaye de réinstaller le JDK aussi. C'est bizarre car je n'ai jamais eu ce problème et j'utilise beaucoup Eclipse et Java.

n°1922931
Yop69
Posté le 10-09-2009 à 13:03:37  profilanswer
 

cbeyls a écrit :

Alors essaye de réinstaller le JDK aussi. C'est bizarre car je n'ai jamais eu ce problème et j'utilise beaucoup Eclipse et Java.


 
Effectivement bonne idée, je vais réinstaller le jdk proprement.
C'est bizarre cette histoire de fenêtre qui se grise comme ca alors que tout est ok !

n°1923088
Yop69
Posté le 10-09-2009 à 18:21:46  profilanswer
 

J'ai désinstallé le JDK mais j'arrive toujours à compiler mon appli et à l'exécuter (elle a d'ailleurs marchée après un reboot de la machine puis la fenêtre s'est grisée à nouveau  :fou: )
 
Je n'arrive pas à désinstaller totalement comme avant quoi. (J'avais Java installé mais je ne pouvais compiler/exécuter d'appli)
Sais tu comment faire ?

n°1923120
pataluc
Posté le 10-09-2009 à 21:14:01  profilanswer
 

je vois pas trop ou est le problème, si ma mémoire est bonne la régle est simple, une seule classe publique par fichier (et autant de classe privée que tu veux) et elle doit être nommée pareil que le fichier, sinon:

 
Code :
  1. D:\>javac Nouveau2.java
  2. Nouveau2.java:1: class Test is public, should be declared in a file named Test.java
  3. public class Test {
  4.        ^
  5. 1 error


pour le fichier:

Code :
  1. private class Test {
  2.  public Test(){}
  3. }
 

donc tu nommes tes classes comme tes fichiers et puis c'est tout. il est ou ton problème, t'as quoi comme erreur?


Message édité par pataluc le 10-09-2009 à 21:14:43
mood
Publicité
Posté le 10-09-2009 à 21:14:01  profilanswer
 

n°1923130
Yop69
Posté le 10-09-2009 à 22:14:40  profilanswer
 

Actuellement ce code marche très bien chez cbeyls

Code :
  1. import javax.swing.JFrame;
  2. public class HelloWorld extends JFrame {
  3. private static final long serialVersionUID = 1L;
  4. public HelloWorld() {
  5.  super("Mon application" );
  6.  setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  7.  setSize(320, 240);
  8. }
  9. public static void main(String[] args) {
  10.  HelloWorld f = new HelloWorld();
  11.  f.setVisible(true);
  12. }
  13. }


 
Sauf que chez moi, j'exécute le code, la fenêtre se lance, quand je veux la fermer par la croix, rien ne se passe, puis la fenêtre se grise et j'ai une popup qui me dit que la fenêtre ne répond pas, voulez vous la tuez ou pas : oui / non. Certaine rare fois, quand je clique sur la croix la fenêtre se ferme correctement.  
Je n'ai bien sur aucun message d'erreur  :sweat:


Message édité par Yop69 le 10-09-2009 à 22:14:51
n°1923143
pataluc
Posté le 10-09-2009 à 23:50:20  profilanswer
 

tu es sous linux ou windows? cf http://www.siteduzero.com/forum-83 [...] eover.html et http://doc.ubuntu-fr.org/java#diff [...] _et_ubuntu

Message cité 1 fois
Message édité par pataluc le 10-09-2009 à 23:55:27
n°1923144
Yop69
Posté le 10-09-2009 à 23:53:40  profilanswer
 


 
Je suis sous Linux Ubuntu 9.04
 
Edit : Youpppppppppiiiiiiiiii !!! ca marche avec ce que tu m'as fournis.
 
Un super merci vraiment c'est GENIAL ! je suis super content !!
 
Un grand merci a toi !!!


Message édité par Yop69 le 11-09-2009 à 00:10:29
n°1923146
pataluc
Posté le 10-09-2009 à 23:54:28  profilanswer
 

bon beh voila, je te conseille la lecture des 2 liens que j'ai mis.

n°1923148
Yop69
Posté le 11-09-2009 à 00:12:22  profilanswer
 

pataluc a écrit :

bon beh voila, je te conseille la lecture des 2 liens que j'ai mis.


 
 :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:  :jap:

n°1923149
cbeyls
Hail to the King, Baby
Posté le 11-09-2009 à 00:16:05  profilanswer
 

Salut Yop69,
 
Sous Ubuntu il existe 3 implémentations Java: gcj, OpenJDK et le JDK de Sun. Moi je te conseille de virer et purger celui que tu as installé actuellement (fais une recherche sur "jdk" dans le gestionnaire de paquet Synaptic) et installer celui de Sun via le paquetage "sun-java6-jdk". C'est le plus stable et fonctionnel à l'heure actuelle. OpenJDK (openjdk-6-jdk) est bien aussi mais pas encore aussi stable, quant à gcj évite-le à tout prix (vire tous les paquetages contenant le mot "gcj" que tu trouveras sur le système). Si tu installes le JDK de Sun, tu auras une plate-forme stable équivalente à celle sous Windows.
 
Si tu n'installes qu'un seul JDK sur le système, cela t'évitera d'avoir à configurer lequel doit être utilisé par défaut.

Message cité 1 fois
Message édité par cbeyls le 11-09-2009 à 00:20:40
n°1923150
Yop69
Posté le 11-09-2009 à 00:20:10  profilanswer
 

cbeyls a écrit :

Salut Yop69,
 
Sous Ubuntu il existe 3 implémentations Java: gcj, OpenJDK et le JDK de Sun. Moi je te conseille de virer et purger celui que tu as installé actuellement (fais une recherche sur "jdk" dans le gestionnaire de paquet Synaptic) et installer celui de Sun via le paquetage "sun-java6-jdk". C'est le plus stable et fonctionnel à l'heure actuelle. OpenJDK (openjdk-6-jdk) est bien aussi mais pas encore aussi stable, quant à gcj évite-le à tout prix (vire tous les paquetages contenant le mot "gcj" que tu trouveras sur le système). Si tu installes le JDK de Sun, tu auras une plate-forme stable équivalente à celle sous Windows.


 
Bon j'espère ne pas avoir fait de bêtise mais sous synaptics j'ai pris tout ce qui contenait gcj et j'ai fait un delete total :) yavait un scré nombre de paquet !

n°1923151
cbeyls
Hail to the King, Baby
Posté le 11-09-2009 à 00:23:42  profilanswer
 

Encore une chose: n'installe pas Eclipse depuis Synaptic sinon il risque de t'installer plein de dépendances inutiles comme gcj justement. Télécharge-le sur le site officiel et extrais-le dans un dossier quelconque de ton répertoire home.

n°1923152
Yop69
Posté le 11-09-2009 à 00:25:45  profilanswer
 

cbeyls a écrit :

Encore une chose: n'installe pas Eclipse depuis Synaptic sinon il risque de t'installer plein de dépendances inutiles comme gcj justement. Télécharge-le sur le site officiel et extrais-le dans un dossier quelconque de ton répertoire home.


 
ah zut je l'ai installé à partir de synptics.
Bon je vais le virer et voir sur le site :)
 
Edit : faut prendre la version EE ou pas ?
Ok j'ai vu avec wikipedia  
 
Merci les gars pour votre aide !


Message édité par Yop69 le 11-09-2009 à 00:46:59
n°1923188
brisssou
8-/
Posté le 11-09-2009 à 09:22:41  profilanswer
 

d'autant qu'avec Synaptic, tu installes une version anté-diluvienne


---------------
HFR - Mes sujets pour Chrome - Firefox - vérifie les nouveaux posts des topics suivis/favoris
n°1923254
Yop69
Posté le 11-09-2009 à 12:13:10  profilanswer
 

brisssou a écrit :

d'autant qu'avec Synaptic, tu installes une version anté-diluvienne


 
Ah oui ?
Justement je n'arrivais pas à voir la version du le site d'eclipse donc je ne me suis pas posé la question de la version de synaptic. Donc encore une preuve qu'il faut pas toujours faire confiance aux dépots. (j'ai du faire confiance aux dépot pour un sale bug de lightning sous thunderbird et je n'avais pas le choix la par contre)

mood
Publicité
Posté le   profilanswer
 


Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Java

  [RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas

 

Sujets relatifs
[RESOLU]J2ME et la génération de timestamp...[Résolu]pb compilation operator ++
[RESOLU]Limiter le nombre de résultats d'un fichier xml[Résolu] problème de CSS sur un menu
[Résolu] Macro excel pour tri tableau par semaineProblème nl2br ? [résolu]
[Résolu] Gestion des plantagesProduit matriciel avec Mysql [Résolu]
[Résolu] Fuite mémoire, que libérer ?[RESOLU]Arrondi à partir d'une chaine de caractère
Plus de sujets relatifs à : [RESOLU] Lors de l'éxecution un coup ca marche, un coup ca marche pas


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR