2017-06-25 10 views
0

私は現在、大学向けの銀行業務アプリケーションプロジェクトに取り組んでいます。ここではスイングを使用していますが、2〜8個のボタンを持つさまざまな画面で構成されています。すべての機能が異なる50以上のボタンを考えてみましょう。すべてのGUIの単一のコンポーネントは、GUIがメインプログラムによって呼び出されたときに呼び出す別のクラスにアウトソースされています。アクションリスナーを別のクラスに移動

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

すべてが、この時点まで正常に動作し、アプリケーションが実際にすでに完全に行われているが、私は今直面してる問題は、私は私のGUIのコンストラクタは、私のためのコードの約600行で埋めたくないということですActionListenersを使用していましたので、コンポーネントとGUI自体をパラメータとして渡して別のクラスに移動しようとしました。しかし、今すぐプログラムを起動すると、ボタンのどれも動作しません。 私はいくつかのウェブサイトを検索してきましたが、実際に私にこれを助けるように思われた答えは見つかりませんでした。

これに関するお手伝いをさせていただきます。 問題を解決するためにコードサンプルなどが必要な場合は、私に教えてください。この投稿を多くの不必要なコードにスパムしたくないだけです。

+0

は正確にあなたの質問に答えていない:あなたは、[Javaの8ラムダ式]を使用して 'addActionListener'コードを減らすことができる(http://www.codejava.net/java-core/the -java-language/java-8-lambda-listener-example)を参照してください。 –

+0

ようこそ。問題を実証するために多くのコードを書く必要はありません。投稿する[mcve]。 – c0der

+0

[例](https://stackoverflow.com/a/37063037/230513)の 'Action'を使用して、機能をカプセル化します。 – trashgod

答えて

1

GUIクラスであなたのActionListenerの参照方法、最も簡単なリファクタリングはGUI内のネストされたクラスの各ActionListenerを持っているだろうあなたがよう:

class DepositeAL implements ActionListener{ 

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

そして、それを使用します。 components.btnDeposit.addActionListener(new DepositeAL());

リファクタリングしますアクションリスナーをネストされていないクラスに変更するには、GUIへの参照を渡す必要があります。

class DepositeAL implements ActionListener{ 

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

そして、それを使用します。components.btnDeposit.addActionListener(new DepositeAL(this));

+0

[例](https://stackoverflow.com/a/37063037/230513)の 'Action'も検討してください。 – trashgod

関連する問題