à supprimer
Pour la barre de menu dans une JFrame, il faut lire la javadoc
Je vous joint une copie d'écran , j'ai voulu rajouter une image, par exemple placer la barre de menu, le texte 2 lignes en dessous au centre, et en dessous l'image du Morpion.
Mais tout se chevauche et ma grille ne prend pas en compte ma contrainte qui demande de mettre à des lignes/colonnes spécifiques.
Merci d'avance
Essaie avec ce code:
Si j'ai bien compris ce que tu veux, ça devrait marchait.
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57 package test; import java.awt.Container; import java.awt.GridBagConstraints; import java.awt.GridBagLayout; import java.awt.Insets; import javax.swing.JFrame; import javax.swing.JLabel; import javax.swing.JMenu; import javax.swing.JMenuBar; import javax.swing.JMenuItem; public class Morpion { public static void main(String [] args){ JFrame fen=new JFrame("Morpion"); JLabel texte=new JLabel("Bienvenue dans le jeu du Morpion !"); fen.setBounds(500, 500, 900, 800); Container contenu=fen.getContentPane(); contenu.setLayout(new GridBagLayout()); GridBagConstraints contrainte=new GridBagConstraints(); JMenuBar barre=new JMenuBar(); JMenu fichier=new JMenu("Fichier"); JMenu about=new JMenu("About"); JMenuItem regles=new JMenuItem("Règles du jeu"); JMenuItem nouvelle=new JMenuItem("Nouvelle partie"); JMenuItem scores=new JMenuItem("Scores"); JMenuItem propos=new JMenuItem("A propos de"); barre.add(fichier); fichier.add(nouvelle); fichier.add(scores); about.add(propos); about.add(regles); barre.add(about); fen.setJMenuBar(barre); contrainte.weighty=1; contrainte.weightx=1; contrainte.insets=new Insets(20,0,0,0); contrainte.gridheight=GridBagConstraints.REMAINDER; contrainte.gridwidth=GridBagConstraints.REMAINDER; contrainte.anchor=GridBagConstraints.PAGE_START; contenu.add(texte,contrainte); fen.setVisible(true); fen.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); } }
PS: Si tu utilises un GridBagLayout, sois sur de ce que tu veux afficher avant de commence, sinon à chaque modification tu vas te prendre la tête....
Merci pour ta réponse, effectivement c'est bien ça que je veux faire, pas facile de s'y retrouver avec ce GridBagLayout, là j'essaie d'ajouter une image en dessous du message de bienvenue, j'y suis pas encore arrivé ^^
edit : oups, j'avais juste oublié d'enlever le :
contrainte.gridheight=GridBagConstraints.REMAINDER;
qui bloquait l'image en dessous, j'essaie de la déplacer maintenant...
Mais j'ai toujours un grand espace entre la ligne de bienvenue et mon image, du coup, à moins de faire un fen.pack(), il y a de l'espace vide...
En laissant le fen.pack() à la fin ça va bien, mais j'aimerais quand même comprendre pourquoi il me laisse cette espace vide quand je le met pas.
J'ai finis toutes les petites actions de ma menu bar (règles du jeu, à propos de, scores, saisie des noms de joueurs). Mais maintenant je me demande comment je vais faire pour afficher la fenêtre de jeu, tout en gardant en mémoire la fenêtre d'accueil, je ne sais pas si je me fais bien comprendre
En fait, je peux afficher la grille de jeu dans une nouvelle fenêtre et laisser la fenêtre d'accueil en attente, ça ça va. Mais je voudrais avoir ma grille de jeu "à la place" de ma fenêtre d'accueil, et que quand je finit ma partie, je puisse revenir sur la fenêtre d'accueil, cette deuxième option est elle réalisable pour un débutant comme moi ?
Merci encore à tous, ça avance tout doucement
Soit FAccueil et FJeu( fenetre d'accueil et de jeu )
pour passer de FAccueil à FJeu : new FJeu(); this.dispose()//this = FAccueil
pour passer de FJeu à FAccueil : new FAccueil(); this.dispose()//this = FJeu
(C'est pas le top mais simple à faire)
Après si tu veux toujours la même fenêtre mais que le contenu change.
Tu redéfinie contenue de ta JFrame avec setContaintPane(unPanel);
Ou alors tu utilise un Canvas. Pas trop trop compliquer à utiliser
Merci, bon pour l'instant je fais ça en deux fenêtre, ça sera aussi bien, mais c'est marrant j'ai essayé de remplacer le contenu de ma première fenêtre quand même pour voir, avec ta méthode (setcontentpane) et j'ai mis dedans un Jpanel vide, ba ça reste inchangé, ça n'écrase rien. Enfin pas grave, c'est un détail.
Là j'ai crée une grille de Jbutton dans laquelle je vais mettre les images de croix et de rond, le seul problème c'est qu'apparemment il faille des images de la même taille que les JButton car elles ne sont pas redimensionné par rapport au JButton. Et quand on clique sur un bouton, l'image est mise dedans, mais quand je clique sur un autre bouton, il enlève l'image du premier : En gros impossible d'avoir plusieurs boutons avec l'image dedans en même temps. Bizarre, j'essaie de fixer le bouton après avoir mis l'image dedans...
bon avec setIcon ça fonctionne bien, et je supprime le MouseListener dès qu'un bouton contient une image. J'ai alterné l'image croix et l'image rond.
Tout fonctionne bien, reste plus qu'à simplifier tout ça parce que là j'ai vraiment ça "à l'arrache", j'ai crée mes boutons un par un, au lieu de faire un tableau tout bête
Reste plus qu'à faire les comparaisons des combinaisons gagnantes (3 croix, 3 ronds en ligne, colonne, diagonale) et c'est bon
Après je m'atelerai à un mode contre l'ordi mais là c'est autre chose au niveau de l'IA à réaliser...
Merci encore à tous, je reviendrais surement demain avec des questions sur des problèmes imprévus, mais en attendant, je vais dormir
Bonne nuit à tous
Merci encore à tous
Bon, bilan de la journée, j'ai réussi à mettre mes boutons dans un tableau, j'ai tout "proprifié"
Tout marche bien, il y a juste un truc que je voudrais faire, j'ai deux JComboBox (une pour chaque joueur) dans laquelle je vais mettre le symbole choisi (X ou O) . Je voudrais que quand le joueur 1 choisisse la croix (X), la liste de choix du joueur 2 soit limité au rond (O) et inversement.
J'ai réussi à la faire avec des actionListener sur chaque JcomboBox en supprimant les items voulus.
Mais je voudrais aller plus loin, par exemple je sélectionne "X" pour le premier joueur, il ne reste plus que "O" pour le choix du deuxième joueur, mais si je veux finalement changer avant de valider, et choisir "O" pour le joueur 1, j'ai un problème, car j'ai déjà supprimé certains items pour le deuxième joueur. J'ai essayé de remettre tous les choix dans les Box au début de chaque Action listener mais ça ne marche pas bien ...
Merci d'avance
Voila ce que j'ai pour l'instant, j'ai rajouté un choix "aléatoire" pour les symboles, là ça ne marche pas, ça bugg complètement :
Code java : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37 symbolej1.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { symbolej2.removeAllItems(); symbolej2.addItem("Croix : X"); symbolej2.addItem("Rond : O"); symbolej2.addItem("Aléatoire"); if(((String)symbolej1.getSelectedItem())=="Croix : X"){ symbolej2.removeItemAt(0); symbolej2.removeItemAt(1); }else if(((String)symbolej1.getSelectedItem())=="Rond : O"){ symbolej2.removeItemAt(1); symbolej2.removeItemAt(1); }else{ symbolej2.removeItemAt(0); } } }); symbolej2.addActionListener(new ActionListener(){ public void actionPerformed(ActionEvent arg0) { symbolej1.removeAllItems(); symbolej1.addItem("Croix : X"); symbolej1.addItem("Rond : O"); symbolej1.addItem("Aléatoire"); if(((String)symbolej2.getSelectedItem())=="Croix : X"){ symbolej1.removeItemAt(0); symbolej1.removeItemAt(1); }else if(((String)symbolej2.getSelectedItem())=="Rond : O"){ symbolej1.removeItemAt(1); symbolej1.removeItemAt(1); }else{ symbolej1.removeItemAt(0); symbolej1.removeItemAt(0); } } });
J'ai une autre question, j'ai fait mon mode contre l'ordinateur. Mais je voudrais ralentir un peu la réflexion de celui ci au moment où il met son symbole.
Par exemple :
bouton.setCroix() : ça c'est moi, je met l'image de la croix dans mon bouton
bouton.setAleatoire() : ça c'est l'ordinateur qui met un pion.
dans ma méthode setAléatoire, j'ai mis un Thread.sleep(1000);
Le problème c'est que je clique pour mettre mon pion, et le thread ralentit MON affichage, et ensuite il met tout de suite le pion de l'ordinateur.
Comme si dès que je clique sur mon bouton, il n'a même pas le temps de mettre mon image dedans qu'il est coupé dans son action par le Thread qui vient juste après dans le code.
Il faudrait qu'il finisse d'abord de mettre mon pion, avant de faire la suite.
Ne jamais faire de Thread.sleep() dans le thread de l'interface graphique.
Un tuto expliquant le pourquoi du comment de la relation GUI/Threads en Swing/AWT. A lire impérativement.
Vous avez un bloqueur de publicités installé.
Le Club Developpez.com n'affiche que des publicités IT, discrètes et non intrusives.
Afin que nous puissions continuer à vous fournir gratuitement du contenu de qualité, merci de nous soutenir en désactivant votre bloqueur de publicités sur Developpez.com.
Partager