2011-02-03 6 views
2

Bonne journée!Java Getter et Setter Problème

J'ai créé deux classes à savoir Setting and Game; Dans mon jeu, accédez à la classe Setting en premier.

Dans ma classe de réglage, j'appelle la méthode setter de jeu qui est .setDifficulty. et lui attribuer une valeur à elle, par exemple == 2.

public class Setting extends javax.swing.JDialog { 

     public Setting (JFrame owner) { 
       super(owner, true); 
       initComponents(); 
       setSize(400, 250); 
       setLocation(370, 250); 
       getContentPane().setBackground(new Color(128, 201, 20)); 
      } 
     private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {         
      dispose(); 
      MainGame m2 = new MainGame(this); 
      m2.setDifficulty(jComboBox1.getSelectedIndex()); 
     }   

Puis-je accéder à mon deuxième classe qui est le jeu. Mais je ne peux pas obtenir la valeur de difficileLvl en dehors de la méthode setter. (Voir mes commentaires sur le code)

 public class Game extends javax.swing.JDialog { 
     private int difficultLvl = 0; 

     public Game(JFrame owner) { 
      super(owner, true); 
      initComponents(); 
      setSize(500, 500); 
      setLocation(300, 120); 
      getContentPane().setBackground(Color.getHSBColor(204, 204, 255)); 
      System.out.println(difficultLvl); //SHOULD BE == 2, but == 0; 
     } 


     public void setDifficulty(int Difficulty) { 
      this.difficultLvl = Difficulty; 
      System.out.println(difficultLvl); == to 2 which is correct... 
     } 

Le problème est que je ne peux pas accéder à la valeur difficultLvl en dehors de la classe setter ... Il retourne à sa valeur attribuée par défaut qui dans ce cas est 0. Qu'est-ce que je fais faux? Comment accéder à la valeur dans la méthode setter. J'ai utilisé this.difficultLvl mais sans résultat. Je suis juste nouveau en Java ... S'il vous plaît aider! Votre aide serait extremement appreciee. Merci.

+0

Vous définissez 'difficileLvl' dans' MainGame' et l'obtenez dans 'Game', alors comment pourrait-il être possinel. –

+0

alors que dois-je faire pour obtenir la valeur d'une classe à l'autre? – newbie

Répondre

1

Je vois un couple de problèmes.

D'abord êtes-vous sûr d'instancier MainGame dans la classe Setter? Est-ce une sous-classe de Game ou quelque chose de différent? Si le code est correct, difficultLvl' in MainGame has nothing to do with difficileLvl in Game` - les deux sont des classes différentes.

Deuxième si vous voulez le niveau de difficulté pour un jeu, soit le faire avec le constructeur:

public Game(int difficultyLevel) { 
    this.difficultyLvl = difficultyLevel; 
} 

ou avec la méthode setter, mais vous définissez la valeur après création de l'objet et , parce que nous ne pouvons pas regarder dans le futur, vous ne verrez rien d'autre que la valeur initiale avec votre code actuel.

1

Vous imprimez la valeur dans le constructeur. À ce stade, la valeur sera 0. C'est seulement après l'appel de setDifficulty() que la valeur est définie sur 2.

2

difficultLvl est une variable d'instance, donc elle a une valeur pour chaque instance. Chaque fois que vous créez une nouvelle instance de Game, elle a son propre diffucultLvl initialisé à 0. Si vous définissez le difficultLvl dans un Game, il ne le modifie pas pour les autres instances Game et il n'affecte pas les futures nouvelles instances Game.

private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {         
     dispose(); 
     MainGame m2 = new MainGame(this); 
     m2.setDifficulty(jComboBox1.getSelectedIndex()); 
}  

Dans ce code, vous créez un jeu, MainGame m2 = new MainGame(), mais il a de la difficulté par défaut, qui est ce qui est imprimé dans le constructeur. Ensuite, vous définissez son niveau de difficulté (si vous imprimez la difficulté après cela, ce sera juste). Alors le jeu est jeté: il devient hors de portée - c'était seulement une variable locale.

+0

alors comment puis-je accéder à une variable d'une autre classe sans l'initialiser? – newbie

3

Dans le constructeur du jeu, le membre 'difficileLvl' sera zéro car c'est ce à quoi il est initialisé - aucune raison de s'attendre à être 2. Une fois construit, utilisez la méthode setter pour définir la valeur à 2; à partir de ce moment-là, la valeur sera 2 jusqu'à ce que cela soit réglé sur autre chose.

Si vous deviez ajouter une méthode getter:

public int getDifficulty() { 
    return difficultLvl; 
} 

et appelez cela, vous verrez la valeur.

Je suppose que vous ne voulez pas construire un nouveau jeu sur chaque clic de souris, mais plutôt garder un et il suffit d'appeler la méthode setter sur le clic de souris:

private MainGame m2 = new MainGame(this); 

    public Setting (JFrame owner) { 
      super(owner, true); 
      initComponents(); 
      setSize(400, 250); 
      setLocation(370, 250); 
      getContentPane().setBackground(new Color(128, 201, 20)); 
     } 
    private void btnOkMouseClicked(java.awt.event.MouseEvent evt) {         
     m2.setDifficulty(jComboBox1.getSelectedIndex()); 
    } 
+0

J'ai créé une méthode getter dans le jeu mais je ne peux toujours pas accéder à la valeur – newbie

+0

Je suppose que la raison pour laquelle vous ne pouvez pas y accéder est que vous créez le jeu dans votre gestionnaire de clic de souris - l'instance de jeu devient hors de portée détruit une fois la manipulation du clic de la souris est terminée. Vous devez donc créer l'objet de jeu de sorte qu'il ait une durée de vie plus longue, de sorte qu'il dure plus longtemps qu'un clic de souris. J'ai donné une suggestion pour cela dans ma réponse originale ci-dessus. –

1

Son parce que vous créez d'abord l'objet MainGame et System.out.println est dans le constructeur. ALORS vous appelez le setter pour changer la valeur. Mais le constructeur a déjà imprimé la valeur initiale (puisqu'il est arrivé en premier). Sollution: Le niveau de difficulté doit être un paramètre du constructeur pour que cela fonctionne.

Utilisez un débogueur et examinez-le de plus près.C'est une chose très basique, donc il est important de bien comprendre ce qui se passe ici.

1

Cette ligne appelle le constructeur et crée un objet avec difficultLvl = 0;

MainGame m2 = new MainGame(this); 

Et après que vous appelez

m2.setDifficulty(jComboBox1.getSelectedIndex()); 

alors difficultLvl de m2 sera mis à l'index sélectionné.

1

Vous semblez créer une instance de MainGame dans votre gestionnaire d'actions de clic de souris qui récupère à son tour la collecte des ordures dès que l'invocation de méthode se termine. Donc votre valeur (= 2) est perdue puisque l'objet qui la contient est collecté. Donc, sur un autre clic, vous créez une nouvelle instance qui a une valeur (= 0) puisque vous l'initialisez avec 0.

private int difficileLvl = 0;

Je ne sais pas grand-chose sur ce que vous voulez faire, mais il semble que vous vouliez garder un pointeur vers l'objet de jeu quelque part dans votre application.