Lors de l'éxecution un coup ca marche, un coup ca marche pas [RESOLU] - Java - Programmation
Marsh Posté le 09-09-2009 à 03:10:16
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 :
|
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 :
|
Marsh Posté le 09-09-2009 à 04:23:21
Bon dieu de bon dieu !
Si je m'attendais à une telle réponse !! merci c'est super gentil à toi ! j'ai copié ton code et ça fonctionne à merveille
Quelques questions :
1) concernant la convention ok, je m'y attacherais.
2) à quoi sert private static final long serialVersionUID = 1L;
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
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 )
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 )
Marsh Posté le 09-09-2009 à 04:34:57
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
Marsh Posté le 09-09-2009 à 15:08:19
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 :
|
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).
Marsh Posté le 10-09-2009 à 09:03:48
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
Marsh Posté le 10-09-2009 à 12:57:11
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.
Marsh Posté le 10-09-2009 à 13:03:37
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 !
Marsh Posté le 10-09-2009 à 18:21:46
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 )
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 ?
Marsh Posté le 10-09-2009 à 21:14:01
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 :
|
pour le fichier:
Code :
|
donc tu nommes tes classes comme tes fichiers et puis c'est tout. il est ou ton problème, t'as quoi comme erreur?
Marsh Posté le 10-09-2009 à 22:14:40
Actuellement ce code marche très bien chez cbeyls
Code :
|
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
Marsh Posté le 10-09-2009 à 23:50:20
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
Marsh Posté le 10-09-2009 à 23:53:40
pataluc a écrit : tu es sous linux ou windows? cf http://www.siteduzero.com/forum-83 [...] eover.html et http://doc.ubuntu-fr.org/java |
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 !!!
Marsh Posté le 10-09-2009 à 23:54:28
ReplyMarsh Posté le 11-09-2009 à 00:12:22
ReplyMarsh Posté le 11-09-2009 à 00:16:05
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.
Marsh Posté le 11-09-2009 à 00:20:10
cbeyls a écrit : Salut Yop69, |
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 !
Marsh Posté le 11-09-2009 à 00:23:42
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.
Marsh Posté le 11-09-2009 à 00:25:45
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 !
Marsh Posté le 11-09-2009 à 12:13:10
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)
Marsh Posté le 08-09-2009 à 21:02:16
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 )
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 )
Merci beaucoup pour votre aide !
Message édité par Yop69 le 11-09-2009 à 00:11:03