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

  FORUM HardWare.fr
  Programmation
  Java

  Problème : éviter l'exécution prématurée de certaines lignes de code

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

Problème : éviter l'exécution prématurée de certaines lignes de code

n°359967
Miklp
Posté le 13-04-2003 à 22:51:22  profilanswer
 

Bonjour,
 
Je veux programmer un puissance 4 en Java (nom de la class : Jeu), où l'on peut choisir le nombre de lignes et le nombre de colonnes pour le tableau, mais mon problème s'étend à d'autres types de programmes, pas seulement à un puissance 4.
Pour que l'utilisateur choisisse ces 2 paramètres je crée une classe Options qui contient en attributs nbRow et nbCol (des entiers), des cases de texte, un bouton Ok et dont le constructeur crée une fenêtre d'options (on a donc class Options extends JFrame implements ActionListener).
La class Jeu a pour attribut (entre autres) Options opts;
 
Voici ce qui se passe quand on clique sur le bouton Ok d'une fenêtre Options :
 
public void actionPerformed(ActionEvent evt) {
 nbRow = Integer.parseInt(text1.getText());
 nbCol = Integer.parseInt(text2.getText());
}
 
Voici maintenant le constructeur de Jeu :
 
public Jeu() {
 opts = new Options();
 matJeu = new byte[options.nbRow][options.nbCol];  // MatJeu est un attribut de Jeu contenant la matrice de la partie en cours
 nbCoups = 0;
}
 
Ce qui veut dire que une fois que la personne a cliqué sur Ok, il faudrait créer la matrice matJeu avec les paramètres de la classe Options.
Mais le problème est que les lignes d'après (matJeu = new byte[options.nbRow][ ......) s'exécutent tout de suite, sans que l'utilisateur n'ait encore cliqué sur Ok. D'où des erreurs dues au fait que opts.nbRow et opts.nbCol n'existent pas encore (ne sont pas initialisées).
 
Comment remédier à ce problème ? Comment attendre que la personne ait cliqué sur le bouton Ok pour exécuter la suite du constructeur de Jeu ?

mood
Publicité
Posté le 13-04-2003 à 22:51:22  profilanswer
 

n°360002
sashock
Posté le 13-04-2003 à 23:13:55  profilanswer
 

t'appelle le constructeur de jeu() apres que l'utilisateur ait choisi ses options:

Code :
  1. public void actionPerformed(ActionEvent evt) {
  2. nbRow = Integer.parseInt(text1.getText());
  3. nbCol = Integer.parseInt(text2.getText());
  4. new Jeu(); // ici
  5. }


Message édité par sashock le 13-04-2003 à 23:14:44
n°360206
Miklp
Posté le 14-04-2003 à 10:54:41  profilanswer
 

saSHOCK > Merci de ta réponse, mais le problème est que Options a été créé à partir du constructeur de Jeu, donc si on rappelle à partir d'Options le constructeur de Jeu, on va recréer un Options, etc...
Mais j'ai peut-être une idée pour résoudre le problème... Je vais essayer et je dirai si ça marche.
 
Mais en fait, pour être plus clair dans l'explication de mon problème, je voudrais en quelque sorte reprogrammer une sorte d'InputDialog améliorée. En effet les InputDialog arrêtent le programme (les lignes d'après ne s'exécutent pas) tant que l'utilisateur n'a pas cliqué sur Ok.

n°360224
souk
Tourist
Posté le 14-04-2003 à 11:15:02  profilanswer
 

je crois qu'il y a deja eu un topic sur les fenetres modales en java, mais si je puis me permettre, concernant ton probleme, je pense qu'il vaudrait mieux que tu concoives ton programme differement, parce que c'est pas tres joli ce que tu fais. Tu devrais separer le jeu et la configuration de l'interface graphique, ca evitera plein de problemes, et ce sera plus facile a maintenir. Je pense que ca fait partie des bonnes habitudes a prendre.
(ca se discute sur des petits programmes on peut sans probleme, mais sinon, je pense que c'est mieux quand meme de prendre une bonne habitude)
 
PS: et pourquoi tu fais pas un InputDialog comme tu dis ? (JDialog quoi)

n°360226
noldor
Rockn'roll
Posté le 14-04-2003 à 11:16:25  profilanswer
 

Je conseille le pattern MVC

n°360238
Miklp
Posté le 14-04-2003 à 11:23:55  profilanswer
 

souk > Merci beaucoup de ta réponse, ça me semble intéressant :)
En fait si, le graphisme (la fenetre d'options) est séparée justement, c'est la classe Options. La classe Jeu est celle du jeu, et cette classe contient comme attribut un object Options... Pour le moment, afin de simplifier mon message, je ne parle pas de l'interface graphique elle-même, à savoir la grille du puissance 4 avec les pinos, etc... Mais si vous voulez je peux vous envoyer toutes les sources.
 
Le problème du InputDialog (c'est ce que j'avais fait tout au début, je me demande si je ne vais pas y revenir...) c'est que ça demande qu'une donnée à la fois (il faut donc plusieurs InputDialogs, un correspondant au nb de lignes, l'autre au nb de colonnes), moi je voudrais faire une fenetre d'options où ça demande tout en même temps jusqu'à ce que l'on clique sur Ok.
Par contre, qu'est-ce qu'un JDialog ??? Ca a l'air intéressant ;) Je connais JFrame, JWindow, mais pas JDialog... (j'ai appris Swing la semaine dernière il faut dire   ;) )

n°360257
souk
Tourist
Posté le 14-04-2003 à 11:37:57  profilanswer
 

noldor a écrit :

Je conseille le pattern MVC


clair, MVC forever :bounce:
 
sinon, dans mon esprit, la fenetre option fait partie de l'interface graphique. Fait un programme avec des options par defaut, tu rajoute l'interface par dessus, et au moment de l'ouverture de ta fenetre principale, tu invoque un panneau de configuration si tu veux.
 
Une autre methode valable -- mais moins joli (mais ca marche) -- c'est de mettre des valeurs par defaut dans ta classe Option, et de cacher la fenetre, tu ne la montre que quand tout est pret. Je pense que ce sera plus simple pour adapter ton programme.

n°360260
Cherrytree
cn=?
Posté le 14-04-2003 à 11:41:19  profilanswer
 

Problème de désign.


---------------
Le site de ma maman
n°360277
Miklp
Posté le 14-04-2003 à 11:53:01  profilanswer
 

Etant plutôt débutant, je ne sais pas ce qu'est le MVC (mais je suis en train de me renseigner), mais apparement, pour résoudre mon problème, le JDialog semble être le mieux. J'ai en effet besoin d'une fenêtre bloquante, donc le JDialog semble être très bien adapté, même si je ne sais pas encore l'utiliser.

n°360305
Miklp
Posté le 14-04-2003 à 12:14:52  profilanswer
 

Est-il possible de reprogrammer une sorte de InputDialog avec JDialog ?
Par exemple reprogrammer un InputDialog où il y a 2 cases de texte, au lieu d'une, et tel que la suite du programme ne s'exécute pas tant que l'utilisateur n'a pas cliqué sur un bouton de cette fenêtre, tout comme un InputDialog ? (Apparement, on appelle ça des fenêtre modales, ou bloquantes).

mood
Publicité
Posté le 14-04-2003 à 12:14:52  profilanswer
 

n°360308
souk
Tourist
Posté le 14-04-2003 à 12:21:33  profilanswer
 

Miklp a écrit :

Est-il possible de reprogrammer une sorte de InputDialog avec JDialog ?
Par exemple reprogrammer un InputDialog où il y a 2 cases de texte, au lieu d'une, et tel que la suite du programme ne s'exécute pas tant que l'utilisateur n'a pas cliqué sur un bouton de cette fenêtre, tout comme un InputDialog ? (Apparement, on appelle ça des fenêtre modales, ou bloquantes).


 
oui, ca doit pas etre complique, essaie de regarder le code et de creer une classe qui fait la meme chose pour plusieurs parametres. Sinon, tu enchaines plusieurs JDialog a la suite.

n°360330
Cherrytree
cn=?
Posté le 14-04-2003 à 12:40:03  profilanswer
 

Dans ton cas, c'est effectivement JDialog qui est préconisé. JDialog est un conteneur au même titre que JFrame, et à la différence de JOptionPane dans son utilisation classique.
 
En tant que conteneur, tu peux lui ajouter tout ce que tu désires. Si ton bonheur c'est deux JTextField et des JButton, aucun problème.
 
A partir du moment où tu fixes bien la modalité de ton Dialog, tu es assuré que l'utilisateur devra en finir avec celui-ci, avant de retourner au reste de ton programme.


---------------
Le site de ma maman
n°360355
souk
Tourist
Posté le 14-04-2003 à 13:00:03  profilanswer
 

:jap:

n°360377
Miklp
Posté le 14-04-2003 à 13:53:31  profilanswer
 

Merci beaucoup Cherrytree. Juste une petite question : comment est-ce que je fixe la modalité de mon JDialog ?
 
A part ça, je pense que ça s'utilise comme un JFrame, c'est-à-dire comme suit :


public class Partie extends JDialog implements ActionListener {
.....
}

n°360382
Cherrytree
cn=?
Posté le 14-04-2003 à 13:59:24  profilanswer
 

Miklp a écrit :

Merci beaucoup Cherrytree. Juste une petite question : comment est-ce que je fixe la modalité de mon JDialog ?
 
A part ça, je pense que ça s'utilise comme un JFrame, c'est-à-dire comme suit :


public class Partie extends JDialog implements ActionListener {
.....
}

 


Tu disposes de quantité de constructeurs pour instancier un JDialog. Celui que j'utilise est le suivant :
 

Code :
  1. JDialog(Frame owner, String title, boolean modal);


 
Ici, le paramètre modal, de type booléen sert à fixer la modalité de ton dialogue. Pour l'utilisation que tu veux en faire, modal = true.
 
Autrement dit, ton code devrait ressembler à ça :

Code :
  1. Partie(Frame owner) {
  2.     super(owner, "Partie", true);
  3.     ...
  4. }


---------------
Le site de ma maman
n°360401
Miklp
Posté le 14-04-2003 à 14:16:19  profilanswer
 

Cherrytree >
J'ai essayé de faire ce que tu m'as dis, mais le problème viens de la frame owner, je ne sais pas qui elle est... Sachant que la classe Jeu n'étend pas JFrame (public class Jeu(), et c'est tout ... !). La fenêtre Partie elle est de type JDialog par contre (dans mes autres messages, Partie s'appelait Options). Mais je vais essayer de me débrouiller...
Dans le constructeurs Jeu, je vais faire un new Partie() et je vais essayer de "bidouiller" le constructeur de Partie (de type JDialog) avec une ligne du type super(this, "Partie", true); et après je rajoute mes panels, etc...

n°360418
Cherrytree
cn=?
Posté le 14-04-2003 à 14:32:33  profilanswer
 

Tu n'as pas de Frame ?
 
C'est ennuyeux. Comment affiches-tu le jeu ?
 
En général, un bon désign consiste à avoir une classe gérant les routines : ta classe Jeu, et une Frame, par exemple JeuFrame, servant à l'affichage et la gestion des composants graphiques.


---------------
Le site de ma maman
n°360426
Miklp
Posté le 14-04-2003 à 14:37:53  profilanswer
 

Alors en fait si, j'ai une frame de jeu, qui est la classe Grille et donc dans la classe Jeu, il y a un attribut de type Grille. Le problème est que Grille est initialisé une fois que le classe Jeu a reçu le nombre de lignes et le nombre de colonnes que l'utilisateurs a choisis, car dans son code, elle crée un GridBagLayout (pour les cases de jeu) correspondant aux dimensions...
 
Voici une partie du code de Jeu (je peux le donner en entier) :
 

class Jeu {
 Grille plateau;  // Juste le graphisme
 byte[][] matJeu; // La matrice qui contiendra la partie
 int nbCoups;  // Contient le nombre de coups joués (détection partie nulle)
 boolean enCours; // Indique si la partie est en cours ou terminée
 JDialog opts;
 
 public Jeu() {
  opts = new JDialog(new Options(), "hello", true);
  plateau = new Grille(new int[opts.nbRow][opts.nbCol]); //On crée une nouvelle grille appelée jeu avec les dimensions précisées
  matJeu = new byte[opts.nbRow][opts.nbCol];
  nbCoups = 0;
  enCours = true;
 }

 
 
Ici, Options correspond à Partie d'autres messages.

n°360440
Miklp
Posté le 14-04-2003 à 14:46:28  profilanswer
 

Mais j'ai peut-être une idée pour mon programme, pour faire en sorte que ça marche. Ca va peut-être mettre du temps à la faire, mais ça devrait marcher avec cette alternative.
Merci beaucoup de vos réponses en tout cas, je vais vous tenir au courant si ça marche ;)

n°360447
Cherrytree
cn=?
Posté le 14-04-2003 à 14:50:59  profilanswer
 

Classiquement, on recourt à deux moyens.
 
Soit tu mets ta grille dans un JPanel, lequel est dynamiquement généré, puis ajouté à ta Frame.
 
Soit tu initialises ta Frame avec des valeurs par défaut, comme dans démineur de Microsoft par exemple. Ensuite, tu recrées la grille en fonction de valeurs entrées par ton utilisateur.


---------------
Le site de ma maman
n°360475
Miklp
Posté le 14-04-2003 à 15:05:46  profilanswer
 

Oui la méthode démineur de Microsoft est une bonne solution après tout, enfin je vais voir  ce que je vais faire.

mood
Publicité
Posté le   profilanswer
 


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

  Problème : éviter l'exécution prématurée de certaines lignes de code

 

Sujets relatifs
[C] probleme lecture de fichier[openGL][Linux] probleme de linkage [résolu]
Probleme avec l affichage des imagesProblème avec l'hauteur d'un tableau -> resolu
Probleme en php[PHP] probleme avec GD sur Imageloadfont
expreg, chti problème...[opengl et c++] ces 2 lignes suffisent-elles pour charger un bmp ?
[DELPHI] Peut-on eviter de charger des composants dans ...problème cadre
Plus de sujets relatifs à : Problème : éviter l'exécution prématurée de certaines lignes de code


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