2010-11-03 6 views
3

J'ai deux classes gameWindow et gameEngine. La méthode principale est dans gameWindow classe & est donc le code GUI swing. Maintenant, je veux accéder aux composants de swing dans gameEngine. Comment faire ça? Je reçois toujours l'erreur cannot find symbol lorsque je l'essaie normalement. J'ai essayé de rendre les composants publics mais sans chance.Accès aux composants Swing d'une autre classe

En outre, j'ai essayé de créer une instance de gameWindow mais aussi, n'a pas aidé. Il a compilé sans erreur mais j'ai eu une erreur d'exécution BIG (que je ne peux même pas voir, l'invite de commande est défilée à sa limite).

RELP !!

P.S .: Je ne pense pas que l'affichage du code ici aidera.

+0

Pouvez-vous nous montrer la partie du code où vous instanciez la GameWindow? –

Répondre

2

Afin d'accéder aux composants de gameWindow dans gameEngine vous avez besoin d'une référence. Donc je suppose que la classe GameWindow crée l'instance de GameEngine. Ensuite, vous pouvez faire quelque chose comme ceci:

public class GameEngine{ 
     GameWindow window; 

     public GameEngine(GameWindow gm){ 
      window = gm; 
     } 
     //rest of your code 
} 

public class GameWindow(){ 

    //At the point where you create the GameEngine 
    GameEngine ge = new GameEngine(this); 
    //rest of your code 


} 

maintenant GameEngine a une référence à la GameWindow qu'il peut utiliser.

Cela dit, je vous conseille de considérer un design différent. Avoir GameEngine accéder directement aux sons de GameWindow comme si les mauvaises classes sont responsables des mauvaises choses. Peut-être que vous pourriez essayer d'utiliser une sorte d'observateur tel que GameWindow cherche des changements dans GameEngine puis accède aux mises à jour et modifie la vue en conséquence. Le GameEngine n'a donc pas besoin d'accéder aux composants swing de GameWindow.

+0

Je vais regarder dans les références de passage maintenant. Aussi, j'ai intentionnellement conçu comme ça pour voir si cela a fonctionné et appris quelque chose de nouveau. Même si je ne savais pas que c'était un mauvais design, mais puisque vous avez suggéré que je vais aller voir un observateur. Merci. – MoonStruckHorrors

1

Passez une référence à gameEngine dans le constructeur ou utilisez une méthode de type getter/setter. Par exemple, dans gameWindow, lorsque vous créez la classe gameEngine, utilisez un constructeur qui prend une variable gameWindow.

moteurJeu:


gameWindow theMainWindow = null; public gameEngine(gameWindow mainWindow) { theMainWindow = mainWindow; }

1

La réponse de Vincent est correcte, mais implique l'instanciation GameWindow qui a déclaré que le message donne une erreur. Je vous conseille de rediriger votre trace de pile d'erreurs vers un fichier, de le lire et de résoudre votre erreur d'exécution, puis de suivre ses instructions.

+0

Je ne connaissais rien au passage des références, donc j'ai juste instancié la classe 'gameWindow' par' gameWindow instance1 = new gameWindow(); '. – MoonStruckHorrors

Questions connexes