Faire correspondre une variable d'une méthode à l'autre ?

Résolu/Fermé
gamarts99 Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 23 mars 2016 - 23 mars 2016 à 11:22
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 - 24 mars 2016 à 13:31
Bonjour,

je suis entrain de faire une battle ship intelligent mais mon problème est que je ne sais pas comment faire pour faire correspondre une variable d'une méthode à l'autre ?

EXEMPLE:

public static void main(String[] args) throws IOException {
int x = 45;
testx(args);
}

static void testx(String[] args){
System.out.println(x);
}

Voila mon problème, je n'arrive pas a afficher "x".
Je précise que cela est un exemple !

merci de vos réponse a mon message de détresse ;) !

2 réponses

greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
Modifié par greg6614 le 23/03/2016 à 16:03
Salut, deux solutions :

Premièrement en reprenant ton exemple :

 
public static void main(String[] args) throws IOException {
     int x = 45;
     testx(args, x);
}

static void testx(String[] args, int x){
     System.out.println(x);
}


On rajoute la variable dans l'entête de la méthode pour la passer en paramètre.

Ou bien second choix :

 
private int x;

public static void main(String[] args) throws IOException {
     x = 45;
     testx(args, x);
}

static void testx(String[] args){
     System.out.println(x);
}


Ici x sera visible dans toute ta classe mais uniquement dans cette classe. C'est l'encapsulation. Je rappel quand même que dans une methode
static
tu ne peux pas utiliser le mot clés
this
. Par contre si ta méthode n'est pas
static
par convention l'appel aux attributs se font précédés par
this
.

Exemple :

public class Animal{

     private int pattes;

     public Animal(int nbrPattes){
          this.pattes = nbrPattes;
     }

     public int getNbrPattes(){
          return this.pattes;
     }
}


Tu as différents mots-clés pour la visibilité des tes attributs au seins d'une classe :
private
public
static
protected


Un exmple qui devrait t'aider :

public class Mere {
 private int a;
 protected int b;
 public int c;
 static int d;
}

public class Fille extends Mere {

 public void afficher() {
  System.out.println(a); /*ne marche pas car  une variable private n'est pas visible depuis une classe fille*/
  System.out.println(b); /*marche car une variable protected est visible depuis une classe fille*/
  System.out.println(c): /*fonctionne tout le temps car c est public*/
  System.out.println(Mere.d): /*fonctionne tout le temps car d est static, cependant il faut l'appeler via la classe*/
 }

}

public class Externe { //On suppose que la classe Externe est dans un autre package que Mere et Fille
 
public void afficher() {
  Mere m = new Mere();
  System.out.println(m.a); // ne marche pas
  System.out.println(m.b); // ne marche pas
  System.out.println(m.c): //fonctionne tout le temps car c est public
  System.out.println(Mere.d): /*fonctionne tout le temps car d est static, cependant il faut l'appeler via la classe*/
 }

}


Enfin si tu ne précise pas de visibilité, ton attribut est "package friendly" c'est à dire qu'il sera visible dans toutes les classes de ton package.

Un attribut static ne nécessité pas l''instanciation de sa classe pour être visible et est défini dans un contexte statique et non objet, c'est à dire que cette variable n'existe qu'en un seul exemplaire.

Rq : La visibilité s'applique aussi au méthodes.
En espérant t'avoir aider 
Greg
0
gamarts99 Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 23 mars 2016
23 mars 2016 à 16:35
salut,

merci pour ta réponse rapide et pour ton conseille qui ma beaucoup aidé, en revanche chez moi ta 2eme solution ne marche pas il me crache une erreur ! voici ce que NetBeens me dit :



si tu peut m'aider car ta 2eme solution m’intéresse aussi pour mon projet.
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
Modifié par greg6614 le 23/03/2016 à 16:43
Autant pour moi je suis allé trop vite. Dans une méthode
static
tu ne peux manipuler que des variables
static
ou local (donc déclarées dans ta méthode). Le soucis avec ces variables c'est qu'elles n'existent qu'une seul fois pour ta classe et non une fois par objet.

Donc ici si tu met x en
static
sa valeur sera unique et donc chaque modification de celle-ci sera valable pour toutes tes autres instances. D'où l’intérêt de créer des classes annexes.

Surtout qu'il ne faut généralement jamais écrire trop de code dans un main car JAVA t'exécute ta méthode main comme point d'entré dans ton programmes puis "jette" le main et ne s'en sert plus jusqu’à la fin de l'exécution.
0
gamarts99 Messages postés 3 Date d'inscription mercredi 23 mars 2016 Statut Membre Dernière intervention 23 mars 2016 > greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017
23 mars 2016 à 16:50
merci infiniment pour ton aide, je pourrais enfin finir mon projet ;-) !
0
greg6614 Messages postés 592 Date d'inscription vendredi 7 août 2009 Statut Membre Dernière intervention 3 juin 2017 107
23 mars 2016 à 17:48
Avec plaisir, n'oublie pas de mettre ton sujet en résolu :)
0
poisson86 Messages postés 123 Date d'inscription vendredi 9 décembre 2011 Statut Membre Dernière intervention 18 janvier 2023 2
24 mars 2016 à 13:06
Rebonjour je voulais savoir ce que vous pensiez de ce code qui correspond au menu de mon jeu, et mon problème avec le code que je vous ai déjà donner c'était de faire un sous menu et donc de replacer mon panneau, j'ai compris grâce à votre exemple sauf que lorsque que j'essaye de faire cela avec du graphisme tout ne marche pas et je tourne en rond :/




import java.awt.Color;
import java.awt.Font;
import java.awt.Graphics;
import java.awt.Toolkit;
import java.awt.event.*;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;

public class Main {

public static void main(String[] args) {

Fenetre Fen = new Fenetre();
}

}

public class Fenetre extends JFrame implements ActionListener{
JButton b_jouer = new JButton("Jouer");
JButton b_options = new JButton("Options");
JButton b_boutique = new JButton("Boutique");
JButton b_succes = new JButton("Succès");
Pan_Menu pan_menu = new Pan_Menu();

public Fenetre(){

/////super("Kash: CW"); ->>>> je ne comprends pas à quoi sert Super() ici ça nomme la fenetre

this.setSize(1000, 600);
this.setLocationRelativeTo(null);
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.setResizable(false);

this.setContentPane(pan_menu);
pan_menu.setLayout(null);

//Bouton Jouer
b_jouer.addActionListener(new Fen_Jouer());
pan_menu.add(b_jouer);
b_jouer.setBounds(350, 250, 300, 100);

//Bouton Options
b_options.addActionListener(new Options());
pan_menu.add(b_options);
b_options.setBounds(850, 430, 100, 100);

//Bouton Boutique
b_boutique.addActionListener(new Fen_Boutique());
pan_menu.add(b_boutique);
b_boutique.setBounds(400, 430, 200, 100);

//Bouton Succès
b_succes.addActionListener(new Fen_Succes());
pan_menu.add(b_succes);
b_succes.setBounds(50, 430, 100, 100);

this.setVisible(true);

}


public class Pan_Menu extends JPanel {
JButton bouton = new JButton("Mon bouton");

public void paintComponent(Graphics g){

Font font = new Font("Courier", Font.BOLD, 40);
g.setFont(font);
g.setColor(Color.RED);
g.drawString("Kash : Celestial Wonder", 225,130);

/* try { Image img = ImageIO.read(new File("menu.png"));
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
//Pour une image de fond
//g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
} catch (IOException e) {
e.printStackTrace();
} */
}
}
}

}
0
poisson86 Messages postés 123 Date d'inscription vendredi 9 décembre 2011 Statut Membre Dernière intervention 18 janvier 2023 2
24 mars 2016 à 13:08
Voici le code qui essaie de faire ce sous menu ^^

import java.awt.event.*;
import java.io.IOException;
import javax.imageio.ImageIO;
import javax.swing.*;


import java.awt.*;


public class Options implements ActionListener {
Pan_Options pan_menu = new Pan_Options();


public void actionPerformed(ActionEvent e){
JPanel pan_options = new JPanel();

pan_options.setContentPane(pan_options);

}


public class Pan_Options extends JPanel {
JButton bouton = new JButton("Mon bouton");

public void paintComponent(Graphics g){

Font font = new Font("Courier", Font.BOLD, 40);
g.setFont(font);
g.setColor(Color.BLUE);
g.drawString("test fenetre option", 225,130);
}
}
}
0