2009-12-07 9 views
2

Je crée une interface utilisateur qui montre des graphiques et manipule des graphiques. La classe étend JFrame implémente ActionListener. L'ActionListener appelle alors différentes classes pour manipuler les graphes en fonction de l'action. Cela a fonctionné pendant que la classe avait peu d'assistants d'action; Cependant, maintenant la classe devient ingérable.Java Architecture - Question sur les conventions ActionListener

Je sais que dans l'intérêt de l'encapsulation, il serait préférable d'avoir le ActionListener dans la classe de l'interface utilisateur parce qu'il a besoin d'accéder aux composants non statiques de l'interface. Cependant, il semble qu'il y ait un conflit entre l'encapsulation et la lisibilité. Ce que je propose est de classer la classe en une classe pour l'interface et une seconde pour l'ActionListener et accéder aux composants de l'interface de façon statique. Ce que je veux savoir est-ce que cela suit les conventions de conception de base? Et, si cette approche est acceptable, placez-vous la classe principale dans la classe user-interface ou dans la classe ActionListener?

Répondre

6

Not a duplicate question... but my answer should help with your question.

Courte estivale, ma préférence serait que la classe JFrame n'implémente pas ActionListener et qu'elle ait un certain nombre de classes internes nommées avec le JFrame qui implémente le ActionListener.

Je placerais le principal dans une classe en soi ... et l'appelons Main.

Voici quelques exemples de code pour la façon dont je tiens à le faire:

import javax.swing.JFrame; 
import javax.swing.SwingUtilities; 


public class Main 
{ 
    private Main() 
    { 
    } 

    public static void main(String[] args) 
    { 
     SwingUtilities.invokeLater(new Runnable() 
     { 
      public void run() 
      { 
       createAndShowGUI(); 
      } 
     }); 
    } 

    private static void createAndShowGUI() 
    { 
     final FooFrame frame; 

     frame = new FooFrame(); 
     frame.setupGUI(); 
     frame.pack(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     frame.setVisible(true); 
    } 
} 

et l'interface graphique:

import java.awt.FlowLayout; 
import java.awt.LayoutManager; 
import java.awt.event.ActionEvent; 
import java.awt.event.ActionListener; 
import javax.swing.JButton; 
import javax.swing.JFrame; 


public class FooFrame 
    extends JFrame 
{ 
    private final JButton incrementBtn; 
    private final JButton decrementBtn; 
    private int value; 

    { 
     incrementBtn = new JButton("++"); 
     decrementBtn = new JButton("--"); 
    } 

    private class IncrementListener 
     implements ActionListener 
    { 

     public void actionPerformed(final ActionEvent evt) 
     { 
      increment(); 
     } 

    } 

    private class DecrementListener 
     implements ActionListener 
    { 

     public void actionPerformed(final ActionEvent evt) 
     { 
      decrement(); 
     } 

    } 

    public void setupGUI() 
    { 
     final LayoutManager layout; 

     layout = new FlowLayout(); 
     setLayout(layout); 
     setupListeners(); 
     addComponents(); 
    } 

    private void setupListeners() 
    { 
     incrementBtn.addActionListener(new IncrementListener()); 
     decrementBtn.addActionListener(new DecrementListener()); 
    } 

    private void addComponents() 
    { 
     add(incrementBtn); 
     add(decrementBtn); 
    } 

    private void increment() 
    { 
     value++; 
     System.out.println("value = " + value); 
    } 

    private void decrement() 
    { 
     value--; 
     System.out.println("value = " + value); 
    } 
} 
+0

Grande réponse, mais avant d'accepter cette réponse, permettez-moi que je comprendre. Ce que vous suggérez, c'est que la classe JFrame et la classe Actionlistener implémentent actionlistener. Et que le JFrame l'interprète et le passe à l'ActionListener pour le traitement? – slimbo

+0

Donnez-moi un peu et je vais mettre un peu de code :-) (il suffit de se mettre au travail ... temps d'examen :-) – TofuBeer

+0

Merci beaucoup, je l'apprécie vraiment. – slimbo