pb de eventHandling avec swing, comment faire dans ce cas ?

pb de eventHandling avec swing, comment faire dans ce cas ? - Java - Programmation

Marsh Posté le 12-04-2004 à 16:07:42    

:hello: ,
je demarre un peu en java et surtout en gui. Dans mon premier program "fenetre" j utilsais quelque chose comme ca :
 

Code :
  1. //....
  2. JButton b1 = new JButton(" Add an Item " );
  3. b1.addActionListener(this);
  4. b1.setActionCommand("ACTION1" );
  5. //....
  6. public void actionPerformed(ActionEvent event) {
  7.        
  8.         String command = event.getActionCommand();
  9.         if (command.equals("ACTION1" )) {
  10. //....


 
Notre prof nous as donne un projet a faire en suivant une sorte de modele. J ai quelque question as ce sujet que j aurai bien pus lui demander mais la, on as 2 semaine de break et aucune reponse possible.
 
voila le modele de gui a utiliser, les questions sont dans le code  
 

Code :
  1. package Assignment2;
  2. import javax.swing.*;
  3. import java.awt.*;
  4. import java.awt.event.*;
  5. import java.util.*;
  6. public class GameGUI extends JFrame {
  7.   private JLabel blackLabel, redLabel, whiteLabel;
  8.   JTextField blackField, redField, whiteField;
  9.   JTextField outputMSG, inputGuess, userName;
  10.   private Button quitButton, giveUpButton, guessButton, tryNewNumberButton;
  11.   TextArea instructions;
  12.    
  13.                          
  14.    public GameGUI(Ryg g) {
  15.    //question 1 :
  16.    //qu est ce que  Ryg viens faire la ? c quoi comme parametre vu qu
  17.    //aucun objet ne s apelle Ryd ? une faute de frappe ?
  18.    
  19. Panel p1 = new Panel(new BorderLayout());
  20. Panel p2 = new Panel();
  21. Panel p3 = new Panel();  // for labels
  22. Panel p4 = new Panel(); // for fields
  23. Panel p5 = new Panel(new BorderLayout());
  24. Panel p6 = new Panel();
  25. blackLabel = new JLabel("Black" );
  26. blackField = new JTextField(3);
  27. blackField.setEditable(false);
  28. redLabel = new JLabel("Red" );
  29. redField = new JTextField(3);
  30. redField.setEditable(false);
  31. whiteLabel = new JLabel("White" );
  32. whiteField = new JTextField(3);
  33. whiteField.setEditable(false);
  34. quitButton = new Button("QUIT" );
  35.         quitButton.addActionListener(new CancelEventHandler(g));
  36.         //question 2a
  37.         //je connaisais addActionListener(this) , mais la je dois creer
  38.         //une class CancelEventHandler ? et cette classe aura qu elle
  39.         // methodes      ?
  40.         giveUpButton = new Button("GIVE UP" );
  41. p2.add(quitButton);
  42. p2.add(giveUpButton);
  43. p3.add(blackLabel);
  44. p4.add(blackField);
  45. p3.add(redLabel);
  46. p4.add(redField);
  47. p3.add(whiteLabel);
  48. p4.add(whiteField);
  49. //giveUpButton.addActionListener(new GiveUpEventHandler(g));
  50.         //meme principe que 2a
  51. p1.add(p2,BorderLayout.SOUTH);
  52. p5.add(p3,BorderLayout.NORTH);
  53. p5.add(p4,BorderLayout.CENTER);
  54. p1.add(p5,BorderLayout.NORTH);
  55. outputMSG = new JTextField(30);
  56. outputMSG.setText("Please enter your guess" );
  57. outputMSG.setEditable(false);
  58. p1.add(outputMSG, BorderLayout.CENTER);
  59. inputGuess = new JTextField(3);
  60. inputGuess.setEditable(true);
  61. p6.add(inputGuess);
  62. guessButton = new Button("GUESS" );
  63. p6.add(guessButton);
  64. //guessButton.addActionListener(new GuessHandler(g));
  65.         //meme principe que 2a
  66. tryNewNumberButton = new Button("Get New Number" );
  67. p6.add(tryNewNumberButton);
  68. //tryNewNumberButton.addActionListener(new NewNumberHandler(g));
  69.         //meme principe que 2a
  70. p5.add(p6,BorderLayout.SOUTH);
  71. setTitle("Black, Red and White Game" );
  72. userName = new JTextField();
  73. g.userName = "" + userName;
  74. this.getContentPane().add(p1);
  75. this.pack();
  76. this.show();
  77. WelcomeDialog d = new WelcomeDialog(this, "Welcome" );
  78. d.setVisible(true);
  79.        
  80.   }
  81. }
  82. class WelcomeDialog extends Dialog implements ActionListener {
  83. //question 3
  84.         //extend Dialog ? je vois pas de surclass Dialog. amoins que sa
  85.         //soit une class predefini dans java
  86. JTextField name;
  87.  GameGUI gui;
  88.        
  89.  WelcomeDialog(GameGUI parent, String title) {
  90.   super(parent, title, false);
  91.   gui = parent;
  92.   System.out.println("parent " + gui.userName);
  93.   setLayout(new FlowLayout());
  94.   setSize(300, 200);
  95.   add(new Label("Please enter your name" ));
  96.   JTextField name = new JTextField(10);
  97.   name.setEditable(true);
  98.   add(name);
  99.   parent.userName = name;
  100.   TextArea instructions = new TextArea("Welcome to the Black Red and White Game. \n A number between 100 and 999 has been chosen \n for you to guess. \n", 4, 20, TextArea.SCROLLBARS_NONE);
  101.   add(instructions);
  102.   Button b;
  103.   add(b = new Button("Play Game" ));
  104.   b.addActionListener(this);
  105.  }
  106.    public void actionPerformed(ActionEvent e){
  107.      
  108.   dispose();
  109.    }
  110. }


 
je suis vraiment coince avec le tryNewNumberButton.addActionListener(new NewNumberHandler(g)); et derives.
 
Merci pour votre aide.

Reply

Marsh Posté le 12-04-2004 à 16:07:42   

Reply

Marsh Posté le 13-04-2004 à 01:03:11    

:sweat:

Reply

Marsh Posté le 13-04-2004 à 01:14:38    

ta classe CancelEventHandler devra obligatoirement implémenter l'interface ActionListener et donc forcément la méthode qui est dedant (actionPerformed). Il faudra aussi lui mettre un constructeur qui prend un Ryg en paramètre. Pareil pour les autres question du même type.
 
 
Dialog est une classe AWT, je vois pas pourquoi utiliser ça en premier niveau dans une application swing.
 
 
De même qu'il est complètement inutile de sous-classer JFrame et Dialog, donc autant pas le faire. Puisque c'est une connerie.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 13-04-2004 à 02:04:13    

Code :
  1. class CancelEventHandler  implements ActionListener {
  2.    CancelEventHandler(Ryg g) {
  3.    //?? Ryg g vas servir a quoi au fait ? je dois creer une
  4.    //class Ryg ? masi je ne connais meme pas son but. :/
  5.    public void actionPerformed(ActionEvent event) {
  6.    // action
  7.    }


merci nraynaud

Reply

Marsh Posté le 13-04-2004 à 07:47:20    

nraynaud a écrit :


De même qu'il est complètement inutile de sous-classer JFrame et Dialog, donc autant pas le faire. Puisque c'est une connerie.


pour ma culture, c'est quoi le problème d'étendre JFrame ?

Reply

Marsh Posté le 13-04-2004 à 08:48:44    

benou a écrit :


pour ma culture, c'est quoi le problème d'étendre JFrame ?

Une instance d'une sous-classe de JFrame est une JFrame on peut donc lui appliquer tout ce qu'on fait à JFrame, donc par exemple :
 
Tu prends ton instance, tu vires sont ContentPane,  
tu lui mets un nouveau ContentPane
 
Et voilou, tu viens de détruire le bordel.
 
 
 
Donc on ne sousclasse pas à moins d'avoir une bonne raison de le faire. En swing, il n'y a quasiment jamais de bonnes raisons de sous-classer, tout est "pluggable" dans tous les sens et c'est fait exprès.
 
Ce mécanisme de swing est assez déroutant pour les débutants : on parle d'objet alors on doit faire des classes alors chaque objet du système doit avoir sa propre classe ... C'est faux. On fait pas des classes pour trier du code par ordre d'idée ce sont les méthodes qui servent à ça.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 13-04-2004 à 09:09:00    

ok. je suis assez d'accord avec toi ... ca parait logique.
 
mais la plupart des tutoriaux et autres exemples de GUI font de l'héritage de JFrame ...

Reply

Marsh Posté le 13-04-2004 à 09:16:02    

benou a écrit :

mais la plupart des tutoriaux et autres exemples de GUI font de l'héritage de JFrame ...

oui, je suis encore à la recherche d'une explication qui ne fasse pas entrer en ligne de compte des hallucinogènes. Les héritages sont très propres dans le JDK et en vrac dans les tutos, je ne comprends pas.


---------------
trainoo.com, c'est fini
Reply

Marsh Posté le 14-04-2004 à 03:27:44    

j ai refais le Gui du jeu, mais j ai un petit problem avec la creation d objet eventHandler.
 
exemple

Code :
  1. public class GameGUI
  2. {
  3. private String playerName;
  4. private String informString="this an information message";
  5. //.....
  6. private JPanel main;
  7.         public GameGUI() {
  8.   addWidgets();
  9.           JFrame.setDefaultLookAndFeelDecorated(true);
  10.           JFrame welcomeFrame = new JFrame("Game" );              GameFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
  11.   GameFrame.setContentPane(this.main);
  12.   GameFrame.pack();
  13.   GameFrame.setVisible(true);
  14.     }
  15.    
  16. private void addWidgets()
  17. {
  18.  //...
  19.  quit = new JButton("Quit" );
  20.  quit.addActionListener(new QuitEventHandler(this));
  21. }
  22.  
  23. public void setPlayerName(String playerName){ this.playerName=playerName; }
  24. }

 
 
doi je passer comme parametre lobjet GameGUI? ou le frame ?
si je veus que QuitEventHandler(this) ferme le programme ?
 

Code :
  1. public class QuitEventHandler implements ActionListener {
  2. public QuitEventHandler(GameGUI g)
  3. {
  4. //je met l'action quiter ici ?
  5. }
  6.        
  7. //void actionPerformed(ActionEvent e) {
  8. //}
  9. }


 
bref ma class QuitEventHandler  nest surement pas bonne.
 :sweat:

Reply

Marsh Posté le 14-04-2004 à 06:00:17    

j ai passe JFrame an protected et j ai fais ca :

Code :
  1. public class QuitEventHandler implements ActionListener {
  2. private GameGUI g;
  3. public QuitEventHandler(GameGUI g) {this.g = g;}
  4. public void actionPerformed(ActionEvent e) {
  5.  g.GameFrame.setVisible(false);
  6.  g.GameFrame.dispose();
  7. }
  8. }


maintenant sa marche, est ce que c est la bonne methode ?

Reply

Marsh Posté le 14-04-2004 à 06:00:17   

Reply

Marsh Posté le 14-04-2004 à 08:49:26    

la bonne méthod ca aurait été d'ajouter une methode close à GameGui et d'appeler cette méthode dans le actionListener

Reply

Marsh Posté le 14-04-2004 à 09:43:06    

benou a écrit :

la bonne méthod ca aurait été d'ajouter une methode close à GameGui et d'appeler cette méthode dans le actionListener


ah we bonne idee, par contre je suis coince a un endroit..
en suivant le model donne, j ai une class PrimaryGameController, qui entre autre, a une varible "rand" qui stock un nombre pris au hasard.
La class PrimaryGameController s occupe de coordonne toutes les autres classes.
elle a une mehode gameStart qui cree un nomvre "rand" et affiche la fenetre GUI.
 
je veus que mon bouton "give up" affiche dans un label de GUI, la variable "rand"
 

Code :
  1. public class GiveUpEventHandler implements ActionListener {
  2. private GameGUI g;
  3. public GiveUpEventHandler(GameGUI g) {this.g = g;}
  4. public void actionPerformed(ActionEvent e) {
  5.  g.inform.setText("The answer was : " + (rand provenant de ma class PrimaryGameController );
  6. }


 
mais pour cela je dois creer un autre objet PrimaryGameController  
puis appeler la methode get.rand(), et c est faut vu que si je cree cet objet la variable rand nest pas initialiser.
sinon je suis obliger de passer en parametre du constructeur de GameGUI , l objet PrimaryGameController, de meme pour GiveUpEventHandler (GameGUI g,  PrimaryGameController pgc) ? c est moche et lourd il dois y avoir autre chose a faire a la place.
 

Reply

Marsh Posté le 14-04-2004 à 11:09:37    

nraynaud a écrit :

oui, je suis encore à la recherche d'une explication qui ne fasse pas entrer en ligne de compte des hallucinogènes. Les héritages sont très propres dans le JDK et en vrac dans les tutos, je ne comprends pas.


 
ben peut etre que c'est plus simple a mettre en place et a comprendre et que dans 90% des cas "basique" tu fais rien de fabuleu avec JFrame et ca marche très bien  [:proy]

Reply

Marsh Posté le 14-04-2004 à 13:06:23    

EpoK a écrit :


 
ben peut etre que c'est plus simple a mettre en place et a comprendre et que dans 90% des cas "basique" tu fais rien de fabuleu avec JFrame et ca marche très bien  [:proy]  

C'est pas du tout plus simple de faire une classe que de faire une simple méthode, qui peut être statique.
 
Mais je pense avoir trouvé une explication plausible hier : pour ceux de l'élite qui le font, c'est pour avoir des javabeans.
 
Evidement les débutants, c'est par mimétisme (des tutos) et/ou par conception simpliste de l'objet.


---------------
trainoo.com, c'est fini
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed