2017-06-25 1 views
0

Je travaille actuellement sur un projet d'application bancaire pour l'université et l'interface utilisateur graphique (en utilisant swing ici) se compose de nombreux écrans différents, ayant chacun 2 à 8 boutons, donc à la fin, il revient à disons plus de 50 boutons qui ont tous des fonctionnalités différentes. Tous les composants individuels de l'interface graphique sont sous-traités à une classe différente que j'appelle lorsque l'interface graphique est appelée par le programme principal.Déplacez les Actionlisteners vers une classe distincte

import java.awt.*; 
import java.awt.event.*; 

import javax.swing.*; 
import javax.swing.filechooser.FileNameExtensionFilter; 
import javax.swing.text.NumberFormatter; 

import java.sql.*; 
import java.text.DecimalFormat; 
import java.text.NumberFormat; 
import java.io.*; 

public class Gui extends JFrame { 

    private JPanel contentPane = new JPanel(); 
    private static Database userData; 
    private Components components; 

    public Gui(Database userData) { 
     components = new Components(this, userData); 

     ActionListeners al = new ActionListeners(components, this, userData); 

     for (int i = 0; i < components.accountModels.length; i++) { 
      initializeSettings(components.accountModels[i]); 
     } 

     components.checkingAccSettings = readSettings("Checking Account"); 
     components.dayMoneyAccSettings = readSettings("Day Money Account"); 
     components.depositAccSettings = readSettings("Deposit Account"); 
     components.fixedDepositAccSettings = readSettings("Fixed Deposit Account"); 
     components.robberyAccSettings = readSettings("Robbery Account"); 

     components.loadLookAndFeel(); 
     this.userData = userData; 
     setIconImage(Toolkit.getDefaultToolkit() 
       .getImage(Gui.class.getResource("/de/magani/banking/sparkasse_logo_transparent.png"))); 

     Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize(); 
     double width = screenSize.getWidth(); 
     double height = screenSize.getHeight(); 
     int screenWidth = (int) width; 
     int screenHeight = (int) height; 
     setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     setBounds(screenWidth/4, screenHeight/4, screenWidth/2, screenHeight/2); 
     setResizable(true); 
     setMinimumSize(new Dimension(960, 608)); 
     getContentPane().setLayout(null); 

     try { 
      File file = new File("C:/Program Files/Sparbank/adminCred.sparbank"); 
      BufferedWriter out = new BufferedWriter(new FileWriter(file, true)); 
      BufferedReader in = new BufferedReader(new FileReader(file)); 
      String currentLine = null; 
      if (file.exists() && ((currentLine = in.readLine()) != null)) { 
       components.adminPassword = currentLine; 
       in.close(); 
       out.close(); 
      } else { 
       file.createNewFile(); 
       components.adminPassword = "123"; 
       out.write(components.adminPassword); 
       in.close(); 
       out.close(); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 

     // menuScreen 
     components.btnDisplayBalance.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       try { 
        displayBalanceScreen(); 
       } catch (SQLException e1) { 
        e1.printStackTrace(); 
       } 
      } 
     }); 

     components.btnWithdraw.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       withdrawScreen(); 
      } 
     }); 

     components.btnDeposit.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       depositScreen(); 
      } 
     }); 

     components.btnTransfer.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       if (components.currentAccount.equals("Robbery Account")) { 
        robberyScreen(); 
       } else { 
        transferScreen(); 
       } 
      } 
     }); 

Tout fonctionne très bien à ce point et l'application est en fait déjà complètement fait, mais le problème que je suis confronté est maintenant que je ne veux pas rempli mon interface constructeur avec environ 600 lignes de code pour mon ActionListeners, j'ai donc essayé de les déplacer dans une classe différente, en passant les composants et l'interface graphique elle-même en tant que paramètres. Mais lors du lancement du programme, aucun des boutons ne fonctionne. J'ai cherché sur certains sites mais je n'ai pas vraiment trouvé de réponse qui m'a semblé utile.

Toute aide à ce sujet serait très appréciée. Si des échantillons de code ou quelque chose d'autre était nécessaire pour résoudre le problème, n'hésitez pas à me le dire, je ne voulais tout simplement pas spammer ce post avec trop de code inutile.

+0

Pas exactement répondre à votre question: Vous pouvez réduire votre 'addActionListener' code en utilisant [Java 8 expressions lambda] (http://www.codejava.net/java-core/the -java-language/java-8-lambda-listener-exemple). –

+0

Bienvenue sur SO. Il n'y a pas besoin d'autant de code pour démontrer le problème. S'il vous plaît poster [mcve]. – c0der

+0

Utilisez 'Action', pour [exemple] (https://stackoverflow.com/a/37063037/230513), pour encapsuler la fonctionnalité. – trashgod

Répondre

1

Votre ActionListener méthode de référence s dans la classe GUI, donc vous plus facile refactoring serait d'avoir chaque ActionListener dans une classe imbriquée au sein GUI:

class DepositeAL implements ActionListener{ 

     public void actionPerformed(ActionEvent arg0) { 
      depositScreen();   
     } 
    } 

et de l'utiliser: components.btnDeposit.addActionListener(new DepositeAL());

Refactor l'écouteur d'action à une classe non imbriquée, vous devrez passer une référence à GUI:

class DepositeAL implements ActionListener{ 

     private Gui gui; 
     DepositeAL(Gui gui){ 
      this.gui = gui; 
     } 
     public void actionPerformed(ActionEvent arg0) { 
      gui.depositScreen();   
     } 
    } 

et de l'utiliser: components.btnDeposit.addActionListener(new DepositeAL(this));

+0

Considérez également 'Action', pour [exemple] (https://stackoverflow.com/a/37063037/230513). – trashgod