2012-12-11 2 views
1

Im nouveau à Java et im essayant de construire une interface graphique simple avec plusieurs boutons et menus déroulants. J'ai réussi à obtenir une interface graphique de travail mais la vraie question concerne l'utilisation correcte de la méthode actionListener. Pour attribuer une action à un bouton i insérée à chaque actionListener dans sa propre classe, c'est le code:utilisation correcte de l'actionListener dans Java

public class GUI implements something 
{ 
    public static ClientGUI App; 
    private JFrame chatWin; 
    private JMenuBar menubar; 
    private JMenu x; 
    private JMenu y; 
    private JMenuItem exit; 
    private JMenuItem about; 


    public GUI() 
    { 

       /* 
       * some code and parameters 
       */ 

      //creating the menu bar 
      JMenuBar menubar = new JMenuBar(); 
      chatWin.setJMenuBar(menubar); 

      JMenu x= new JMenu("menu1"); 
      menubar.add(x); 
      JMenuItem exit = new JMenuItem("menu2"); 
      x.add(exit); 

      JMenu y= new JMenu("Help"); 
      menubar.add(help); 
      JMenuItem about = new JMenuItem("inner menu1"); 
      y.add(about); 

      //action listener for the exit button 
      class exitaction implements ActionListener 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        System.exit(0); 
       } 
      } 
      exit.addActionListener(new exitaction()); 

      //action listener for the about button 
      class aboutaction implements ActionListener 
      { 
       public void actionPerformed(ActionEvent e) 
       { 
        //some code 
       } 

      } 
     } 

    public static void main (String args[]) 
    { 
     EventQueue.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       App = new GUI(); 
      } 
     }); 
    } 


} 

Est-ce que le code est considéré comme propre et correcte? Y at-il quelque chose que je pourrais améliorer ou besoin de changer?

+1

http://codereview.stackexchange.com/ –

Répondre

2

Je suis la règle:

Si la mise en œuvre d'action est grande, je mets dans une classe interne.

public MyFrame extends JFrame { 

     // componentes creating, etc 

     private static class MyShortAction implements ActionListener { 

      @Override 
      public void actionPerformed(ActionEvent e){ 
       // some big implementation 
      } 

     } 

    } 

En abrégé, je mets une classe anonyme.

myButton.addActionListener(new ActionListener() { 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     // some small code 
    } 

}); 

Si elle est utilisée par d'autres composants, j'extrais vers une classe de niveau supérieur.

public class MyAction implements ActionListener { 

    @Override 
    public void actionPerformed(ActionEvent e){ 
     // some small code 
    } 
} 
+0

merci à tous les gars, cela m'a vraiment aidé! grand merci Marcio, j'ai utilisé tes conseils et ça fonctionne magnifiquement! – undroid

+0

Oui, j'ai aussi aimé vos règles. Obrigado :-P –

0

Il fonctionnera, mais vous pouvez mettre en œuvre que dans une classe séparée ou même dans la classe principale au lieu de créer une classe imbriquée pour chaque bouton ...

public class GUI implements something,ActionListener 
{ 
    //... 
    public GUI() 
    { 
     //... 
     exit.setActionListener(this); 
     about.setActionListener(this); 
     //... 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     Object source = e.getSource(); 
     if(source == exit) 
     { 
      System.exit(0); 
     } else if(source == about) 
     { 
      //action 
     } 
    } 
} 

Vous pouvez également définir une commande d'action à les éléments et comparez la chaîne à la place de l'objet.

public class GUI implements something,ActionListener 
{ 
    //... 
    public GUI() 
    { 
     //... 
     exit.setActionCommand("exit"); 
     exit.addActionListener(this); 

     about.setActionCommand("about"); 
     about.addActionListener(this); 
     //... 
    } 
    public void actionPerformed(ActionEvent e) 
    { 
     String action = e.getActionCommand(); 
     if("exit".equals(action)) 
     { 
      System.exit(0); 
     } else if("about".equals(action)) 
     { 
      //action 
     } 
    } 
} 
+1

Je n'appellerais guère l'implémentation de l'écouteur dans la classe principale une amélioration. Cela expose un détail interne à l'API publique et apporte des problèmes subtils, par exemple, si vous sérialisez le bouton, vous sérialiserez également les champs dans l'interface graphique et les superclasses. – ignis

0

simple façon directe d'ajouter un écouteur d'action à un bouton:

//Create the button 
JButton button_save = new JButton("Save"); 
add(button_save); 

// Create the listener 
button_save.addActionListener(new ActionListener() { 
    public void actionPerformed(ActionEvent arg0) { 
    //do your stuff when button clicked 
    //ex: disable the button 
    button_save.setEnabled(false); 
    } 
}); 
0

à mon humble avis de votre code est déjà correct (je veux dire qu'il travaille, est pas). Le reste est principalement une question de goût (et de la convivialité de votre code). Par exemple, vous voudrez peut-être réutiliser votre code plus tard ou ajouter des fonctionnalités et d'autres boutons à votre programme que vous n'aviez pas encore considéré. Par conséquent, essayez les règles de base suivantes:

  • éviter les classes internes - vous ne savez jamais quand vous voulez instancier un objet de cette classe ailleurs. Donc, utilisez un fichier pour chaque classe (et btw classes devraient commencer par une lettre majuscule)
  • mettre chaque implémentation de l'ActionListener dans sa propre classe. Je sais que cela fera exploser votre projet mais tout votre code sera clairement organisé et vous pourrez même réutiliser la fonctionnalité. Par exemple votre bouton de sortie. Peut-être que vous décidez d'avoir un deuxième bouton de sortie ailleurs dans le programme, alors vous pouvez donner à ces deux boutons le même ActionListener et ainsi la même fonctionnalité.

Pour le compilateur, cela ne fera aucune différence, mais pour vous lorsque votre projet commence à grandir et devient de plus en plus complexe.

+0

merci pour la réponse élaborée! – undroid