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

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

Marsh Posté le 13-04-2003 à 22:51:22    

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 ?

Reply

Marsh Posté le 13-04-2003 à 22:51:22   

Reply

Marsh Posté le 13-04-2003 à 23:13:55    

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
Reply

Marsh Posté le 14-04-2003 à 10:54:41    

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.

Reply

Marsh Posté le 14-04-2003 à 11:15:02    

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)

Reply

Marsh Posté le 14-04-2003 à 11:16:25    

Je conseille le pattern MVC

Reply

Marsh Posté le 14-04-2003 à 11:23:55    

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   ;) )

Reply

Marsh Posté le 14-04-2003 à 11:37:57    

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.

Reply

Marsh Posté le 14-04-2003 à 11:41:19    

Problème de désign.


---------------
Le site de ma maman
Reply

Marsh Posté le 14-04-2003 à 11:53:01    

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.

Reply

Marsh Posté le 14-04-2003 à 12:14:52    

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).

Reply

Marsh Posté le 14-04-2003 à 12:14:52   

Reply

Marsh Posté le 14-04-2003 à 12:21:33    

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.

Reply

Marsh Posté le 14-04-2003 à 12:40:03    

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
Reply

Marsh Posté le 14-04-2003 à 13:00:03    

:jap:

Reply

Marsh Posté le 14-04-2003 à 13:53:31    

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 {
.....
}

Reply

Marsh Posté le 14-04-2003 à 13:59:24    

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
Reply

Marsh Posté le 14-04-2003 à 14:16:19    

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...

Reply

Marsh Posté le 14-04-2003 à 14:32:33    

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
Reply

Marsh Posté le 14-04-2003 à 14:37:53    

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.

Reply

Marsh Posté le 14-04-2003 à 14:46:28    

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 ;)

Reply

Marsh Posté le 14-04-2003 à 14:50:59    

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
Reply

Marsh Posté le 14-04-2003 à 15:05:46    

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

Reply

Marsh Posté le    

Reply

Sujets relatifs:

Leave a Replay

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