Graphique à partir d'un projet existant

Alex44c Messages postés 33 Statut Membre -  
KX Messages postés 19031 Statut Modérateur -
Bonjour à tous,

Ce que j'ai écrit est long, mais ma question finale est simple.
Je suis débutant en java, mais j'ai déjà coder en C, donc éviter, s'il vous plaît, les termes trop techniques.

J'ai récemment créé un jeu de cartes qui est composé :

_ d'un tapis de 5 cartes
_ de 2 joueurs qui ont chacun :
-un nom(String)
-une main de 5 cartes (pile de carte)
-un score(int)

Mon programme marche très bien.

Seulement, maintenant j'aimerais le passer en graphique, donc en utilisant ce que j'ai codé.

J'ai donc créé un nouveau package (que j'ai appeler graphique), dans lequel j'ai créé une classe Accueil (JFrameForm) et une classe FCartes (JDialogForm).
J'ai importé le package du programme déjà codé dans les 2 classes et j'ai créé tous les boutons et autres éléments dans leur "design".

DANS Accueil, j'ai créé un bouton "jouer" qui permet de créer 2 joueurs et le "jeu"(qui permet de mettre en place le jeu : mélange des cartes, ditribuer les cartes aux joueurs, créer le tapis...). Je l'ai testé en essayant d'afficher les noms, score, première carte de la main des joueurs, ça marche.

Mais quand je veux utiliser ces éléments dans la classe FCartes (celle qui permet de jouer au jeu, avec le tapis, les mains des joueurs...), je n'arrive pas à les utiliser. Voici ce que j'ai écrit: (pour le bouton poser une carte, dans FCartes)

jeu.pioche.AjouterCarte((Carte)joueur_1.main.get(0),pioche);//On ajoute la carte du joueur à la pioche

et voici le message de netBeans : package jeu does not exist
package joueur does not exist

et voici ma classe FCartes:

public class FCartes extends javax.swing.JDialog {

/** Creates new form FCartes */
public FCartes(java.awt.Frame parent, boolean modal) {
super(parent, modal);
initComponents();
//Icarte_a_poser.setVisible(false);
}

il n'y a pas de jeu ni de joueur, c'est de là qu'est le problème je pense.

Mais comment utiliser le "jeu" que j'ai créer dans Accueil?
A voir également:

10 réponses

KX Messages postés 19031 Statut Modérateur 3 020
 
AjouterCarte c'est une méthode de quelle classe ?

Si tu dis jeu.pioche.AjouterCarte(...), Java cherche à résoudre ce que sont jeu et pioche, il s'attend donc principalement à avoir l'un de ces deux codes :

1) Méthode statique de la classe pioche dans le package jeu

package jeu;  

class pioche  
{  
    public static void AjouterCartes(...)  
}  

jeu.pioche.AjouterCartes();

2) Méthode de l'objet pioche, attribut de l'objet jeu

class P  
{  
    public void AjouterCartes(...)  
}  

class J  
{  
    public P pioche;  
}  

J jeu = new J();  

jeu.pioche.AjouterCartes();

Dans ton cas, vu que tu n'as pas d'objet jeu comme dans le deuxième code, il cherche la méthode static dans le package jeu comme dans le premier code...
Tu dis avoir créer le jeu dans l'accueil, quel est l'objet que tu obtiens ? De quelle classe ?
Question annexe : tu appelles AjouterCartes, mais où l'as tu défini ? Dans quelle classe ?
La confiance n'exclut pas le contrôle
0
Alex44c Messages postés 33 Statut Membre 1
 
Mon projet a deux packages : "Cartes" où j'ai créé le jeu sans graphique
et "Graphique" que j'ai ajouté pour le faire en graphique

J'ai importé "Cartes" dans "Graphique".

Dans "Graphique" j'ai Accueil 'JFrameForme" et JCartes "JDialogForm".
Donc dans Accueil j'ai créé un bouton jouer où j'ai écrit :

Jeu jeu=new Jeu(Joueur_1,Joueur_2);

Donc là j'ai les joueurs qui ont leurs mains, le tapis qui est mis en place, les scores initialisés...

Puis j'ai écrit : (toujours dans le bouton poser)

fichCartes.setVisible(true); // permet d'ouvrir FCartes, donc la fenêtre de dialogue avec tous les éléments que j'y ai mis.

Seulement, là est mon problème, quand je veux utiliser l'objet jeu créé dans Accueil, j'ai le message que j'ai mis précedement. Je ne sais pas comment envoyer l'objet jeu à FCartes, ni quoi mettre dans sa classe(faut-il y mettre un public Jeu jeu ?)
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Le problème c'est que tu utilises jeu.pioche, est-ce que pioche existe dans la classe Jeu, est-ce qu'il a accès à la méthode AjouterCartes ?
0
Alex44c Messages postés 33 Statut Membre 1
 
Classe Jeu :

public class Jeu {

public Pioche pioche;
public Tapis tapis;
public Joueur joueur1,joueur2; // Instances nécéssaire au jeu : pioche tapis et joueurs

public Jeu(Joueur j1,Joueur j2){//constructeur

this.joueur1=j1;
this.joueur2=j2;// Initialisation des deux joueurs
this.pioche=new Pioche();
pioche.Melanger();// Appel de la fonction permettant de mélanger la pioche
for(int i=0;i<5;i++){// Cinq éxécutions des actions siovantes :
j1.AjouterCarte(j1,pioche); // Ajout d'une carte au joueur 1
j2.AjouterCarte(j2,pioche); // Ajout d'une carte au joueur 2
} // Affecte sa main à chaque joueur
this.tapis=new Tapis(pioche);// Initialisation du tapis
}

Classe Pioche :

public class Pioche {
public List liste_Carte;//la pioche est est une liste de carte

AjouterCartes est une méthode se trouvant dans Pioche

Donc oui il y a accès.

En fait je veux savoir comment utiliser jeu dans FCartes et s'il faut mettre quelque chose de particulier dans sa classe comme public Jeu jeu;
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Si tu créés ton Jeu jeu dans la classe Accueil et que tu veux t'en servir dans la classe FCartes, il faudrait que tu puisses passer la valeur de l'un à l'autre, soit dans un paramètres par exemple du constructeur FCartes(Accueil a) auquel cas tu peux faire a.jeu, soit mais ce n'est pas très élégant ici, passer jeu en static et utiliser Accueil.jeu (enfin si bien sûr j'ai bien compris le problème ^^)
0
Alex44c Messages postés 33 Statut Membre 1
 
Voici ce que j'ai fait, ton conseil à l'air de marcher, merci bcp.

public class FCartes extends javax.swing.JDialog {
public Jeu jeu;

/** Creates new form FCartes */
public FCartes(java.awt.Frame parent, boolean modal, Jeu j) {
super(parent, modal);
initComponents();
this.jeu=j;

//Icarte_a_poser.setVisible(false);
}

Seulement je ne sais pas quoi ajouter dans la parenthèse de la deuxième ligne:

public void run() {
FCartes dialog = new FCartes(new javax.swing.JFrame(), true);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});

Le message d'erreur qui y correspond est :
constructor FCartes in class graphique.FCartes cannot be applied to given types;
required: java.awt.Frame,boolean,package_carte.Jeu
found: javax.swing.JFrame,boolean
reason: actual and formal argument lists differ in length
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Et bien tu dois y mettre ton Jeu jeu, après ça dépend de où tu fais cet appel, si c'est dans la classe Accueil tu devrais juste avoir à faire :
FCartes dialog = new FCartes(new javax.swing.JFrame(), true, jeu);
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
Alex44c Messages postés 33 Statut Membre 1
 
Dans le bouton jouer de Accueil, j'ai rajouté :
fichCartes=new FCartes(this,false,jeu);
fichCartes.setVisible(true); //pour ouvrir la fenêtre de jeu

En mettant Jeu jeu comme ceci:

public void run() {
FCartes dialog = new FCartes(new javax.swing.JFrame(), true,Jeu jeu);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}

le message d'erreur est :
')' expected

';' expected

not a statement

cannot find symbol
symbol: variable Jeu

Mais je ne vois pas où j'ai fait l'erreur.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
tu as écrit new FCartes(new javax.swing.JFrame(), true,Jeu jeu);
Le "Jeu" est en trop, moi j'avais mis new FCartes(new javax.swing.JFrame(), true, jeu);
0
Alex44c Messages postés 33 Statut Membre 1
 
J'avais essayé mais en mettant uniquement jeu, le message d'erreur est :
non-static variable jeu cannot be referenced from a static context
0
Alex44c Messages postés 33 Statut Membre 1
 
Je précise que le public void run est celui de FCartes.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Tu fais un new FCartes à l'intérieur de la méthode run() de FCartes ?
Est-ce qu'il ne faudrait pas plutôt utiliser this ?
Et pourquoi tu as une méthode run() dans un JDialog ?
Est-ce que tu pourrais mettre les lignes de codes qui correspondent au message d'erreur ?
0
Alex44c Messages postés 33 Statut Membre 1
 
Oui, il y a u new FCartes dans la méthode run() de FCartes, mais ça s'est inscrit tout seul, lorsque j'ai créé mon JDialogForm FCartes.

Est-ce qu'il ne faudrait pas plutôt utiliser this ?
Je ne sais pas, je suis débutant en Java, je connais pas trop bien encore.

Et pourquoi tu as une méthode run() dans un JDialog ?
Ca s'est écrit tout seul aussi. Je viens de faire un essai en recréant un JDialog bidon, et ça s'inscrit aussi.

Est-ce que tu pourrais mettre les lignes de codes qui correspondent au message d'erreur ?

public static void main(String args[]) {
java.awt.EventQueue.invokeLater(new Runnable() {

public void run() {
FCartes dialog = new FCartes(new javax.swing.JFrame(), true, jeu);
dialog.addWindowListener(new java.awt.event.WindowAdapter() {

public void windowClosing(java.awt.event.WindowEvent e) {
System.exit(0);
}
});
dialog.setVisible(true);
}
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Bon j'ai un peu plus compris...
Ici le "static context" c'est parce que "tu" appelles jeu dans le main.
Alors le run() ce n'est pas une méthode du JDialog (ouf ^^), mais du Runnable qui est dans invokeLater. Par contre ce main là il est où ? Parce qu'il n'y a pas d'Accueil pour récupérer le jeu...
0
Alex44c Messages postés 33 Statut Membre 1
 
C'est le main dans FCartes.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
Normalement tu as un seul main pour toute ton application. Mais si je comprends bien ta classe principale c'est Accueil, c'est elle qui a le vrai main non ?
0
Alex44c Messages postés 33 Statut Membre 1
 
Accueil me sert juste à récupérer le nom des 2 joueurs et créer le jeu. Et aussi à ouvrir le JDialog qui lui va me permettre de joueur au jeu mais ce coup ci avec des cartes virtuelles (qui seront des JPanel).

Le main s'est créé tout seul, là encore j'ai recréer une classe bidon pour tester et elle a bien un main aussi.
0
KX Messages postés 19031 Statut Modérateur 3 020
 
C'est quoi que tu utilises comme logiciel pour te générer ton code ?
Si tu débutes en Java il vaudrait peut-être mieux que tu t'en passes pour l'instant...

Il n'y a qu'un seul main qui est appelé par programme. En toute logique ce devrait être celui d'Accueil, dans ce cas tu dois pouvoir supprimer le main de FCartes, et c'est au moment où tu ouvres le JDialog dans l'Accueil qu'il faut mettre ton code new FCartes(new JFrame(), true, jeu);
D'ailleurs le new JFrame() doit très certainement correspondre à ton Accueil, donc si tu appelles ce code dans Accueil tu dois faire new FCartes(this, true, jeu);
0