2017-06-25 2 views
0

Ich arbeite derzeit an einem Banking-Anwendungsprojekt für die Universität und die GUI (mit Swing hier) besteht aus vielen verschiedenen Bildschirmen, mit jeweils 2-8 Tasten, so am Ende kommt es darauf an sagen wir mal über 50 Buttons, die alle unterschiedliche Funktionalitäten haben. Alle einzelnen Komponenten der GUI werden in eine andere Klasse ausgelagert, die ich anrufe, wenn die GUI vom Hauptprogramm aufgerufen wird.Move Actionlisteners in eine separate Klasse

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(); 
       } 
      } 
     }); 

Alles funktioniert bis zu diesem Punkt in Ordnung und die Anwendung ist eigentlich schon völlig fertig, aber das Problem, das ich jetzt mit Blick auf bin, dass ich mit etwa 600 Zeilen Code nicht gefüllt für mein meine GUI Konstruktor will ActionListeners, also habe ich versucht, sie in eine andere Klasse zu verschieben, indem ich die Komponenten und die GUI selbst als Parameter übergebe. Aber beim Starten des Programms funktioniert jetzt keiner der Buttons. Ich habe einige Websites gesucht, aber keine Antwort gefunden, die mir dabei geholfen zu haben scheint.

Jede Hilfe zu diesem würde sehr sehr geschätzt werden. Wenn irgendwelche Codebeispiele oder irgendetwas anderes benötigt wurde, um das Problem zu lösen, können Sie mir sagen, ich wollte diesen Beitrag nicht mit viel unnötigem Code spammen.

+0

Nicht gerade Ihre Frage zu beantworten: Sie könnten Ihren 'addActionListener' Code reduzieren, indem Sie [Java 8 Lambda-Ausdrücke] (http://www.codejava.net/java-core/the -java-Sprache/Java-8-Lambda-Listener-Beispiel). –

+0

Willkommen bei SO. Es ist nicht so viel Code erforderlich, um das Problem zu demonstrieren. Bitte posten [mcve]. – c0der

+0

Verwenden Sie 'Action' für [Beispiel] (https://stackoverflow.com/a/37063037/230513), um die Funktionalität zu kapseln. – trashgod

Antwort

1

Ihre ActionListener s Referenzmethode in der GUI Klasse, so dass Sie am einfachsten Refactoring jeden ActionListener in einer verschachtelten Klasse innerhalb GUI zu haben wäre:

class DepositeAL implements ActionListener{ 

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

und es verwenden: components.btnDeposit.addActionListener(new DepositeAL());

Refactoring Wenn Sie den Action-Listener einer nicht verschachtelten Klasse zuordnen, müssen Sie eine Referenz an GUI:

01 übergeben

Und es verwendet: components.btnDeposit.addActionListener(new DepositeAL(this));

+0

Beachten Sie auch "Aktion", für [Beispiel] (https://stackoverflow.com/a/37063037/230513). – trashgod

Verwandte Themen