Problème : éviter l'exécution prématurée de certaines lignes de code - Java - Programmation
Marsh Posté le 13-04-2003 à 23:13:55
t'appelle le constructeur de jeu() apres que l'utilisateur ait choisi ses options:
Code :
|
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.
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)
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 )
Marsh Posté le 14-04-2003 à 11:37:57
noldor a écrit : Je conseille le pattern MVC |
clair, MVC forever
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.
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.
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).
Marsh Posté le 14-04-2003 à 12:21:33
Miklp a écrit : Est-il possible de reprogrammer une sorte de InputDialog avec JDialog ? |
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.
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.
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 :
|
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 ?
|
Tu disposes de quantité de constructeurs pour instancier un JDialog. Celui que j'utilise est le suivant :
Code :
|
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 :
|
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...
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.
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 { |
Ici, Options correspond à Partie d'autres messages.
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
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.
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.
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 ?