Verbesserungsvorschläge

thelegend27

Aktives Mitglied
Sehr geehrtes Forum,
Ich habe ein Programm geschrieben und möchte euch bitten mir Verbesserungsvorschläge/Kritik zu geben.
Hier ist das Programm:
Java:
/*
* To change this license header, choose License Headers in Project Properties.
* To change this template file, choose Tools | Templates
* and open the template in the editor.
*/
package finalgui;

import java.awt.Color;
import java.awt.Dimension;
import java.awt.Toolkit;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.nio.file.Paths;
import javax.swing.BoxLayout;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;
import java.io.*;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.JOptionPane;

/**
*
* @author Ahmet
*/
class MainFrame extends JFrame implements ActionListener {

    String name;
    String iban;
    String pin;

    int currentAccount;
    int currentBalance;

    int regIndex = 0;
    String fileName;
    BankKonto[] accounts = new BankKonto[10000];

    JPanel homePan;
    JButton close;
    JLabel homeHeader;
    JButton login;
    JButton register;

    JPanel registerPan;
    JButton leaveReg;
    JLabel registerHeader;
    JTextField nameIn;
    JButton tryRegister;

    JPanel loginPan;
    JButton leaveLog;
    JLabel loginHeader;
    JLabel ibanPrompt;
    JTextField ibanIn;
    JLabel pinPrompt;
    JTextField pinIn;
    JButton tryLogin;

    JPanel loggedInPan;
    JButton leaveLogged;
    JLabel loggedHeader;
    JButton openCheck;
    JButton openWithdraw;
    JButton openDeposit;
    JButton openTransfer;

    JPanel checkPan;
    JButton leaveCheck;
    JLabel checkHeader;
    JTextField balanceOut;

    JPanel withdrawPan;
    JButton leaveWithdraw;
    JLabel withdrawPrompt;
    JTextField withdrawIn;
    JButton tryWithdraw;

    JPanel depositPan;
    JButton leaveDeposit;
    JLabel depositHeader;
    JTextField depositIn;
    JButton tryDeposit;

    JPanel transferPan;
    JButton leaveTransfer;
    JLabel transferHeader;
    JLabel transIbanPrompt;
    JTextField transIbanIn;
    JLabel transAmountPrompt;
    JTextField transAmount;
    JButton tryTransfer;

    JPanel mainPan;

    MainFrame() throws IOException {
        regIndex = initializeRegIndex();
        accounts = initializeAccounts(accounts);

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Die Bank");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                try {
                    logAccount(accounts);
                    logRegIndex(regIndex);
                } catch (IOException ex) {
                    Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        close = new JButton("Beenden");
        close.addActionListener(this);
        close.setActionCommand("close");
        homeHeader = new JLabel("Wilkommen in der Bank");
        login = new JButton("Einloggen");
        login.addActionListener(this);
        login.setActionCommand("login");
        register = new JButton("Registrieren");
        register.addActionListener(this);
        register.setActionCommand("register");
        homePan = new JPanel();
        homePan.add(close);
        homePan.add(homeHeader);
        homePan.add(login);
        homePan.add(register);
        homePan.setVisible(true);

        leaveReg = new JButton("<=");
        leaveReg.addActionListener(this);
        leaveReg.setActionCommand("leaveReg");
        registerHeader = new JLabel("Geben sie Ihren Namen ein, um sich zu registrieren");
        nameIn = new JTextField(15);
        tryRegister = new JButton("registrieren");
        tryRegister.addActionListener(this);
        tryRegister.setActionCommand("tryRegister");
        registerPan = new JPanel();
        registerPan.add(leaveReg);
        registerPan.add(registerHeader);
        registerPan.add(nameIn);
        registerPan.add(tryRegister);
        registerPan.setVisible(false);

        leaveLog = new JButton("<=");
        leaveLog.addActionListener(this);
        leaveLog.setActionCommand("leaveLog");
        loginHeader = new JLabel("Geben Sie ihre Kontonummer und PIN ein um sich anzumelden");
        ibanPrompt = new JLabel("Kontonummer:");
        ibanIn = new JTextField(6);
        pinPrompt = new JLabel("PIN: ");
        pinIn = new JTextField(6);
        tryLogin = new JButton("einloggen");
        tryLogin.addActionListener(this);
        tryLogin.setActionCommand("tryLogin");
        loginPan = new JPanel();
        loginPan.add(leaveLog);
        loginPan.add(loginHeader);
        loginPan.add(ibanPrompt);
        loginPan.add(ibanIn);
        loginPan.add(pinPrompt);
        loginPan.add(pinIn);
        loginPan.add(tryLogin);
        loginPan.setVisible(false);

        leaveLogged = new JButton("<=");
        leaveLogged.addActionListener(this);
        leaveLogged.setActionCommand("leaveLogged");
        loggedHeader = new JLabel("Wilkommen");
        openCheck = new JButton("Kontostand einsehen");
        openCheck.addActionListener(this);
        openCheck.setActionCommand("openCheck");
        openWithdraw = new JButton("Betrag auszahlen");
        openWithdraw.addActionListener(this);
        openWithdraw.setActionCommand("openWithdraw");
        openDeposit = new JButton("Betrag einzahlen");
        openDeposit.addActionListener(this);
        openDeposit.setActionCommand("openDeposit");
        openTransfer = new JButton("Betrag überweisen");
        openTransfer.addActionListener(this);
        openTransfer.setActionCommand("openTransfer");
        loggedInPan = new JPanel();
        loggedInPan.add(leaveLogged);
        loggedInPan.add(loggedHeader);
        loggedInPan.add(openCheck);
        loggedInPan.add(openWithdraw);
        loggedInPan.add(openDeposit);
        loggedInPan.add(openTransfer);
        loggedInPan.setVisible(false);

        leaveCheck = new JButton("<=");
        leaveCheck.addActionListener(this);
        leaveCheck.setActionCommand("leaveCheck");
        checkHeader = new JLabel("Ihr Kontostand beträgt: ");
        balanceOut = new JTextField(15);
        balanceOut.setEditable(false);
        checkPan = new JPanel();
        checkPan.add(leaveCheck);
        checkPan.add(checkHeader);
        checkPan.add(balanceOut);
        checkPan.setVisible(false);

        leaveWithdraw = new JButton("<=");
        leaveWithdraw.addActionListener(this);
        leaveWithdraw.setActionCommand("leaveWithdraw");
        withdrawPrompt = new JLabel("Geben Sie den Betrag an den Sie abheben möchten!");
        withdrawIn = new JTextField(10);
        tryWithdraw = new JButton("abheben");
        tryWithdraw.addActionListener(this);
        tryWithdraw.setActionCommand("tryWithdraw");
        withdrawPan = new JPanel();
        withdrawPan.add(leaveWithdraw);
        withdrawPan.add(withdrawPrompt);
        withdrawPan.add(withdrawIn);
        withdrawPan.add(tryWithdraw);
        withdrawPan.setVisible(false);

        leaveDeposit = new JButton("<=");
        leaveDeposit.addActionListener(this);
        leaveDeposit.setActionCommand("leaveDeposit");
        depositHeader = new JLabel("Geben Sie den Betrag an, den Sie einzahlen möchten!");
        depositIn = new JTextField(10);
        tryDeposit = new JButton("überweisen");
        tryDeposit.addActionListener(this);
        tryDeposit.setActionCommand("tryDeposit");
        depositPan = new JPanel();
        depositPan.add(leaveDeposit);
        depositPan.add(depositHeader);
        depositPan.add(depositIn);
        depositPan.add(tryDeposit);
        depositPan.setVisible(false);

        leaveTransfer = new JButton("<=");
        leaveTransfer.addActionListener(this);
        leaveTransfer.setActionCommand("leaveTransfer");
        transferHeader = new JLabel("Geben sie den Empfänger und den Betrag der Überweisung an!");
        transIbanPrompt = new JLabel("Kontonummer des Empfängers: ");
        transIbanIn = new JTextField(6);
        transAmountPrompt = new JLabel("Betrag: ");
        transAmount = new JTextField(6);
        tryTransfer = new JButton("überweisen");
        tryTransfer.addActionListener(this);
        tryTransfer.setActionCommand("tryTransfer");
        transferPan = new JPanel();
        transferPan.add(leaveTransfer);
        transferPan.add(transferHeader);
        transferPan.add(transIbanPrompt);
        transferPan.add(transIbanIn);
        transferPan.add(transAmountPrompt);
        transferPan.add(transAmount);
        transferPan.add(tryTransfer);
        transferPan.setVisible(false);

        mainPan = new JPanel();
        mainPan.add(homePan);
        mainPan.add(registerPan);
        mainPan.add(loginPan);
        mainPan.add(loggedInPan);
        mainPan.add(checkPan);
        mainPan.add(withdrawPan);
        mainPan.add(depositPan);
        mainPan.add(transferPan);
        add(mainPan);

    }

    public void actionPerformed(ActionEvent evt) {
        if (evt.getActionCommand().equals("close")) {
            try {
                logAccount(accounts);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                logRegIndex(regIndex);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.exit(0);
        } else if (evt.getActionCommand().equals("login")) {
            homePan.setVisible(false);
            loginPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("register")) {
            homePan.setVisible(false);
            registerPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openCheck")) {
            balanceOut.setText(Integer.toString(accounts[currentAccount].gibKontoStand()));
            loggedInPan.setVisible(false);
            checkPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openWithdraw")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openDeposit")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();

        } else if (evt.getActionCommand().equals("openTransfer")) {
            loggedInPan.setVisible(false);
            transferPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("tryRegister")) {
            if (nameIn.getText().isEmpty()) {
                int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihren Namen ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            } else if (!(nameIn.getText().isEmpty())) {
                iban = String.valueOf((int) (Math.random() * 10000 + 1000));
                pin = String.valueOf((int) (Math.random() * 10000 + 1000));
                name = nameIn.getText().trim();
                accounts[regIndex] = createAccount();
                int input = JOptionPane.showOptionDialog(null, "Ihr Konto wurde erfolgreich erstellt \n Ihre Kontonummer: " + accounts[regIndex].gibKontoNummer() + "\n Ihre PIN: " + accounts[regIndex].gibKontoPIN(), "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                regIndex++;
                if (input == JOptionPane.OK_OPTION) {
                    registerPan.setVisible(false);
                    homePan.setVisible(true);
                    nameIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryLogin")) {
            if (checkInput(ibanIn.getText()) && checkInput(pinIn.getText())) {

                if (ibanIn.getText().isEmpty() || pinIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                boolean checkLogin = false;

                for (int i = 0; i <= accounts.length - 1; i++) {

                    if (accounts[i] == null) {
                        checkLogin = false;
                    } else if (((ibanIn.getText().trim().equals(accounts[i].gibKontoNummer())) && (pinIn.getText().trim().equals(accounts[i].gibKontoPIN())))) {
                        currentAccount = i;
                        checkLogin = true;
                        currentBalance = accounts[currentAccount].gibKontoStand();
                        break;
                    }
                }

                if (checkLogin) {
                    loginPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryWithdraw")) {
            if (checkInput(withdrawIn.getText())) {

                if (withdrawIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(withdrawIn.getText());
                currentBalance = accounts[currentAccount].gibKontoStand();
                accounts[currentAccount].hebeGeldAb(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " abgehoben", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    withdrawPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryDeposit")) {
            if (checkInput(depositIn.getText())) {
                if (depositIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(depositIn.getText());
                accounts[currentAccount].zahleGeldEin(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " eingezahlt", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    depositPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryTransfer")) {
            if (checkInput(transAmount.getText()) && checkInput(transIbanIn.getText())) {
                if (transAmount.getText().isEmpty() || transIbanIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }

                int result = findAccount(accounts, transIbanIn.getText());
                if (result <= -2) {
                    int input = JOptionPane.showOptionDialog(null, "Etwas sehr schlimmes ist passiert", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transIbanIn.setText("");
                        transAmount.setText("");
                        validate();
                    }
                } else if (result == -1) {
                    int input = JOptionPane.showOptionDialog(null, "ÜberweiseungsKonto nicht gefunden", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);

                } else if (result >= 0) {
                    accounts[currentAccount].hebeGeldAb(Integer.parseInt(transAmount.getText()));
                    accounts[result].zahleGeldEin(Integer.parseInt(transAmount.getText()));
                    int input = JOptionPane.showOptionDialog(null, "Überweisung erfolgreich", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transAmount.setText("");
                        transIbanIn.setText("");
                        validate();
                    }
                }
            }
        } else if (evt.getActionCommand().equals("leaveReg")) {
            if (evt.getActionCommand().equals("leaveReg")) {
                registerPan.setVisible(false);
            }
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveLog")) {
            loginPan.setVisible(false);
            homePan.setVisible(true);
        } else if (evt.getActionCommand().equals("leaveLogged")) {
            loggedInPan.setVisible(false);
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveCheck")) {
            checkPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveWithdraw")) {
            withdrawPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveDeposit")) {
            depositPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveTransfer")) {
            transferPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        }
    }

    public int initializeRegIndex() throws FileNotFoundException {
        Scanner scan = new Scanner(new File("regIndex.txt"));
        //   Scanner scan = new Scanner("finalguiaccounts.txt");
        int regIndx = 0;
        int currLine = 0;
        while (scan.hasNextLine()) {
            String input = scan.nextLine();
            regIndx = Integer.parseInt(input);
            currLine++;
        }
        return regIndx;
    }

    public void logRegIndex(int regIndx) throws IOException {
        BufferedWriter bw = null;
        FileWriter fw = null;

        try {
// BankKonto Konto = new BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN)

            fw = new FileWriter(new File("regIndex.txt"));
            bw = new BufferedWriter(fw);

            String content = Integer.toString(regIndx);
            bw.write(content);
        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                if (bw != null) {
                    bw.close();
                }

                if (fw != null) {
                    fw.close();
                }

            } catch (IOException ex) {

                ex.printStackTrace();

            }
        }

    }

    public boolean checkInput(String inputs) {
        boolean converted;
        try {
            Integer.parseInt(inputs);
            converted = true;

        } catch (NumberFormatException e) {
            int input = JOptionPane.showOptionDialog(null, "Daten ungültig", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            converted = false;

        }

        return converted;
    }

    public void logAccount(BankKonto[] log) throws IOException {
        BufferedWriter bw = null;
        FileWriter fw = null;
        if (log != null) {

            try {
// BankKonto Konto = new BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN)

                fw = new FileWriter(new File("finalguiaccounts.txt"));
                bw = new BufferedWriter(fw);
                for (int i = 0; i <= accounts.length - 1; i++) {
                    if (accounts[i] != null) {
                        String content = log[i].gibName() + "," + log[i].gibKontoNummer() + "," + log[i].gibKontoStand() + "," + log[i].gibKontoPIN();
                        bw.write(content);
                        bw.newLine();
                    }
                }

            } catch (IOException e) {

                e.printStackTrace();

            } finally {

                try {

                    if (bw != null) {
                        bw.close();
                    }

                    if (fw != null) {
                        fw.close();
                    }

                } catch (IOException ex) {

                    ex.printStackTrace();

                }
            }
        }
    }

    public String[] splitString(String input) {
        String[] strings = new String[4];
        int for1,
                for2,
                for3;

        String String1,
                String2,
                String3,
                String4;
        for1 = 0;
        for2 = 0;
        for3 = 0;
        String1 = "";
        String2 = "";
        String3 = "";
        String4 = "";
        for (int i = 0; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for1 = String1.length() + 1;
                break;
            } else {
                String1 = String1 + input.charAt(i);
            }
        }
        for (int i = for1; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for2 = for1 + String2.length() + 1;
                break;
            } else {
                String2 = String2 + input.charAt(i);
            }
        }
        for (int i = for2; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for3 = for2 + String3.length() + 1;
                break;
            } else {
                String3 = String3 + input.charAt(i);
            }

        }
        for (int i = for3; i <= input.length(); i++) {
            if (i >= input.length() - 1) {
                String4 = String4 + input.charAt(i);
                break;
            }

            String4 = String4 + input.charAt(i);

        }
        strings[0] = String1;
        strings[1] = String2;
        strings[2] = String3;
        strings[3] = String4;

        return strings;
    }

    public BankKonto[] initializeAccounts(BankKonto[] accounts) throws FileNotFoundException {
        Scanner scan = new Scanner(new File("finalguiaccounts.txt"));
        //   Scanner scan = new Scanner("finalguiaccounts.txt");
        String[] inputs = new String[4];
        int currLine = 0;
        while (scan.hasNextLine()) {
            String input = scan.nextLine();
            inputs = splitString(input);
            accounts[currLine] = new BankKonto(inputs[0], inputs[1], Integer.parseInt(inputs[2]), inputs[3]);
            currLine++;
        }

        return accounts;
    }

    public int findAccount(BankKonto[] accountArr, String ibanStr) {
        int result = -2;
        for (int i = 0; i <= accounts.length - 1; i++) {

            if (accounts[i] == null) {
                result = -1;
            } else if (((ibanStr.trim().equals(accounts[i].gibKontoNummer())))) {
                result = i;
                break;
            }
        }

        return result;
    }

    public BankKonto createAccount() {
        BankKonto create = new BankKonto(name, iban, 0, pin);
        name = null;
        iban = null;
        pin = null;

        return create;
    }

    public class BankKonto {

        String kontoInhaber, kontoNummer, kontoPIN;
        int kontoStand;

        BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN) {
            kontoInhaber = ktoInhaber;
            kontoNummer = ktoNummer;
            kontoPIN = ktoPIN;
            kontoStand = start;

        }

        void hebeGeldAb(int betrag) {
            kontoStand = kontoStand - betrag;
        }

        void zahleGeldEin(int betrag) {
            kontoStand = kontoStand + betrag;
        }

        String gibKontoNummer() {
            return kontoNummer;

        }

        String gibKontoPIN() {
            return kontoPIN;
        }

        String gibName() {
            return kontoInhaber;

        }

        int gibKontoStand() {
            return kontoStand;
        }

    }
}

public class FinalGUI {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        MainFrame frame = new MainFrame();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

}
Deutsch und Englisch ist gemischt, da ich die BannkKonto Klasse aus einem anderen Projekt übernommen habe.

Mit freundlichen Grüßen,
thelegend27
 

JCODA

Top Contributor
Hey,
ich habe nicht alles 100%ig nachvollzogen, aber einiges ist mir aufgefallen. Bitte bedenke, dass dies alles nur Tipps bzw. Ratschläge sind und keine absoluten Wahrheiten.
1. Die ersten drei Attribute name,iban, pin scheinen hier vollkommen fehl am Platz zu sein. Die Methode createAccount benutzt diese zwar, allerdings ebenfalls sehr unnatürlich. Es wäre besser, wenn diese Daten per Parameter übergeben werden.
2. Ich bin mir sicher, dass sich die Methode splitString sehr viel eleganter schreiben lässt. Was soll diese tun? Es springt ins Auge, dass es vielleicht möglich ist die 4 For-Schleifen durch zwei ineinander geschachtelte ersetzen kann. Und falls sie tatsächlich den übergebenen String nur an dem "," splittet: hierfür gibt es die Methode .split(",") auf String-Objekten.
3. Trenne Daten/Logik von deiner Gui. Die Klasse ist viel zu groß.
4. Kommt dann mit Punkt 3, mache Attribute private.
5. Das BankKonto-Array mit fester Größe ist zwar ganz nett, aber vielleicht bietet sich eine ArrayList an dieser Stelle besser an. (Hat dynamische Größe)
6. Wofür wird currLine in initializeRegIndex benötigt?
7. Extrahiere deine Dateinamen in statische Variablen und schreib sie nicht mitten in den Code. Als ultimatives Ziel könnten diese vielleicht sogar in einer Config-Datei gehalten werden.
8. Meist ist es bei For-Schleifen üblich statt i <= accounts.length - 1 folgendes zu schreiben: i < accounts.length (wobei hier stark eigene Meinung drin steckt. )
9. Mit der Java 8-Stream-API lassen sich viele Methoden in Einzeiler verwandeln, dies ist natürlich ein etwas fortgeschrittenes Konzept in Java und auch nicht allzu beliebt, mir gefällt's.
10. Die zufallsgenerierten iban können mehrfach vergeben werden, das ist bestimmt nicht gewollt. Zudem könnte eine pin mehr als 4 Zeichen benötigen. (auch ungewöhnlich)
11. Viele Objekte müssen nicht von vornherein Attribut sein, zum Beispiel müssen JButtons meistens nicht als Attribut gesetzt werden, wenn man sie nachträglich nicht verändern möchte.
12. Das Erben von JFrame steht zwar in vielen Tutorials ist aber meist nicht "richtig", da du hier keinerlei Eigenschaften des JFrame änderst, sondern ihn lediglich benutzt, könntest du auch ein JFrame-Attribut anlegen.
 

thelegend27

Aktives Mitglied
Danke JCODA für deine Antwort,
Und falls sie tatsächlich den übergebenen String nur an dem "," splittet: hierfür gibt es die Methode .split(",") auf String-Objekten.
Ups :O
3. Trenne Daten/Logik von deiner Gui. Die Klasse ist viel zu groß.
Wie mache ich das? Eine Klasse schreiben in der sich eine Gui Klasse und eine Daten/Logik Klasse befindet?
6. Wofür wird currLine in initializeRegIndex benötigt?
Ist von Copy-Paste übriggeblieben :/
9. Mit der Java 8-Stream-API lassen sich viele Methoden in Einzeiler verwandeln, dies ist natürlich ein etwas fortgeschrittenes Konzept in Java und auch nicht allzu beliebt, mir gefällt's.
Werde ich mir aufjedenfall in der Zukunft anschauen.
 

Kababär

Top Contributor
Wie mache ich das? Eine Klasse schreiben in der sich eine Gui Klasse und eine Daten/Logik Klasse befindet?
Korrekt. Und damit nicht genug. Stell dir vor, du kommst auf die Idee, eine neue Kontoart hinzuzufügen, beispielsweise ein Online-Sparbuch ohne PIN.
Dann funktioniert so gut wie nichts mehr und du musst alles anpassen.

Extrahiere deine Dateinamen in statische Variablen und schreib sie nicht mitten in den Code.
Mit statisch meinst du jetzt aber nicht static oder?


Ich habe mir nicht alles genau angeguckt... und gebe @JCODA in vielerlei Hinsicht Recht. Daher werde ich nur ergänzend weitere Anmerkungen machen.

Dein Code lässt sich schlecht lesen. Das liegt daran, dass du eine für mich zu tiefe if-else Verschachtelung hast.

Code:
        if (evt.getActionCommand().equals("close")) {
            try {
                logAccount(accounts);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                logRegIndex(regIndex);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.exit(0);
        } else if (evt.getActionCommand().equals("login")) {
            homePan.setVisible(false);
            loginPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("register")) {
            homePan.setVisible(false);
            registerPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openCheck")) {
            balanceOut.setText(Integer.toString(accounts[currentAccount].gibKontoStand()));
            loggedInPan.setVisible(false);
            checkPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openWithdraw")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openDeposit")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();

        } else if (evt.getActionCommand().equals("openTransfer")) {
            loggedInPan.setVisible(false);
            transferPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("tryRegister")) {
            if (nameIn.getText().isEmpty()) {
                int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihren Namen ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            } else if (!(nameIn.getText().isEmpty())) {
                iban = String.valueOf((int) (Math.random() * 10000 + 1000));
                pin = String.valueOf((int) (Math.random() * 10000 + 1000));
                name = nameIn.getText().trim();
                accounts[regIndex] = createAccount();
                int input = JOptionPane.showOptionDialog(null, "Ihr Konto wurde erfolgreich erstellt \n Ihre Kontonummer: " + accounts[regIndex].gibKontoNummer() + "\n Ihre PIN: " + accounts[regIndex].gibKontoPIN(), "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                regIndex++;
                if (input == JOptionPane.OK_OPTION) {
                    registerPan.setVisible(false);
                    homePan.setVisible(true);
                    nameIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryLogin")) {
            if (checkInput(ibanIn.getText()) && checkInput(pinIn.getText())) {

                if (ibanIn.getText().isEmpty() || pinIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                boolean checkLogin = false;

                for (int i = 0; i <= accounts.length - 1; i++) {

                    if (accounts[i] == null) {
                        checkLogin = false;
                    } else if (((ibanIn.getText().trim().equals(accounts[i].gibKontoNummer())) && (pinIn.getText().trim().equals(accounts[i].gibKontoPIN())))) {
                        currentAccount = i;
                        checkLogin = true;
                        currentBalance = accounts[currentAccount].gibKontoStand();
                        break;
                    }
                }

                if (checkLogin) {
                    loginPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryWithdraw")) {
            if (checkInput(withdrawIn.getText())) {

                if (withdrawIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(withdrawIn.getText());
                currentBalance = accounts[currentAccount].gibKontoStand();
                accounts[currentAccount].hebeGeldAb(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " abgehoben", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    withdrawPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryDeposit")) {
            if (checkInput(depositIn.getText())) {
                if (depositIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(depositIn.getText());
                accounts[currentAccount].zahleGeldEin(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " eingezahlt", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    depositPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryTransfer")) {
            if (checkInput(transAmount.getText()) && checkInput(transIbanIn.getText())) {
                if (transAmount.getText().isEmpty() || transIbanIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }

                int result = findAccount(accounts, transIbanIn.getText());
                if (result <= -2) {
                    int input = JOptionPane.showOptionDialog(null, "Etwas sehr schlimmes ist passiert", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transIbanIn.setText("");
                        transAmount.setText("");
                        validate();
                    }
                } else if (result == -1) {
                    int input = JOptionPane.showOptionDialog(null, "ÜberweiseungsKonto nicht gefunden", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);

                } else if (result >= 0) {
                    accounts[currentAccount].hebeGeldAb(Integer.parseInt(transAmount.getText()));
                    accounts[result].zahleGeldEin(Integer.parseInt(transAmount.getText()));
                    int input = JOptionPane.showOptionDialog(null, "Überweisung erfolgreich", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transAmount.setText("");
                        transIbanIn.setText("");
                        validate();
                    }
                }
            }
        } else if (evt.getActionCommand().equals("leaveReg")) {
            if (evt.getActionCommand().equals("leaveReg")) {
                registerPan.setVisible(false);
            }
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveLog")) {
            loginPan.setVisible(false);
            homePan.setVisible(true);
        } else if (evt.getActionCommand().equals("leaveLogged")) {
            loggedInPan.setVisible(false);
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveCheck")) {
            checkPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveWithdraw")) {
            withdrawPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveDeposit")) {
            depositPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveTransfer")) {
            transferPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        }

Das sind keine Ahnung wie viele If-Else Statements. Überlege dir, ob es Gemeinsamkeiten gibt, sodass du 1. weniger if-else benötigst und 2. abstrahieren kannst. Gerade im unteren Teil befindet sich nahezu redundanter Code. Das einzige was sich unterscheidet, sind die angesprochenen Nodes, deren Sichtbarkeit verändert werden kann. Könnte das eleganter gelöst werden? Sogar evtl ohne if-else?

I/O Methoden befinden sich meistens immer in Utility-Klassen, die public static Methoden haben.
Deine Methode
Code:
 public void logRegIndex(int regIndx) throws IOException {
        BufferedWriter bw = null;
        FileWriter fw = null;

        try {
// BankKonto Konto = new BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN)

            fw = new FileWriter(new File("regIndex.txt"));
            bw = new BufferedWriter(fw);

            String content = Integer.toString(regIndx);
            bw.write(content);
        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                if (bw != null) {
                    bw.close();
                }

                if (fw != null) {
                    fw.close();
                }

            } catch (IOException ex) {

                ex.printStackTrace();

            }
        }

    }

könnte beispielsweise in eine Klasse LogWriter überführt werden und der Dateiname würde ebenfalls als Parameter dienen. So bist du flexibler.

Das sind unter anderem zwei Beispiele von Methoden, die ich nicht unbedingt in einer GUI-Klasse erwarte zu finden.
Ebenso wenig wie die Methode "createAccount". Die Methode kannst du dir sparen, da ja einen Konstruktor hast. Die Referenzen für deine Bankkonto-Attribute sind demnach überflüssig, weil diese ja objektbezogen in deinem Bankkonto-Objekt vorliegen. Über entsprechende Setter/Getter erlangt man an deren Werte.

Weiterhin versuchst du, mehrere Bankkonten in deiner GUI zu verwalten. Am Besten wäre es, wenn du das auslagert. Dies könnte so aussehen:
Erstelle eine Klasse Bank, die eine Liste von Bankkonten verwaltet. Die Bank hat die Methode findAccount() und liefert dir direkt das gefundene Bankkonto oder null zurück. Apropos findAccount(), dein Parameter BankKonto[] accountArr ist überflüssig, weil dieser in der Methode nicht verwendet wird...
Was ich also konkrete meine ist sowas

Code:
public class Bank {

    private BankKonto[] bankKontos;

    /**
     * @param bankKontos
     */
    public Bank(BankKonto[] bankKontos) {
        this.bankKontos = bankKontos;
    }

    public BankKonto[] getBankKontos() {
        return bankKontos;
    }

    public void setBankKontos(BankKonto[] bankKontos) {
        this.bankKontos = bankKontos;
    }

    public int findAccount(String ibanStr) {
        int result = -2;
        for (int i = 0; i <= bankKontos.length - 1; i++) {

            if (bankKontos[i] == null) {
                result = -1;
            } else if (((ibanStr.trim().equals(bankKontos[i].gibKontoNummer())))) {
                result = i;
                break;
            }
        }

        return result;
    }
}

Deine zwei initialize-Methoden könntest du ebenfalls auslagern in eigene I/O Klassen oder zu den dazugehörigen Klassen (Bank und Logger).
Deine Methode initializeAccounts(accounts) könnte "besser" sein. Da der Parameter der gleiche ist wie die Zuweisung und beides Objekte sind, ist es sinniger, den Parameter wegzulassen und das Rückgabe-Objekt in der Methode zu initialisieren. Noch besser wäre es, die Methode einer Klasse zuzuweisen. Anbieten hierfür würde sich die Klasse Bank.
Ich nehme mal an, dass die Methode "splitString" in eine Klasse namens StringUtil ausgelagert wurde und public static ist, dann könnte die Methode (innerhalb der Klasse Bank) so aussehen

Code:
 public void initializeAccounts(String filename) throws FileNotFoundException {
        Scanner scan = new Scanner(new File(filename));
        //   Scanner scan = new Scanner("finalguiaccounts.txt");
        String[] inputs = new String[4];
        int currLine = 0;
        while (scan.hasNextLine()) {
            String input = scan.nextLine();
            inputs = StringUtil.splitString(input);
            bankKontos[currLine] = new BankKonto(inputs[0], inputs[1], Integer.parseInt(inputs[2]), inputs[3]);
            currLine++;
        }

    }

Ich habe des Weiteren festgestellt, dass du die Attribute iban, pin und name auch als lokale Attribute verwenden kannst. Präferiere immer lokale Variablen, falls möglich.

Kleine Auslagerungen können viel Lesbarkeit bringen und was viel wichtiger ist: Bessere Wartung und bessere Flexibilität.
Ursprüngliche Klasse
Code:
import javax.swing.*;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;
import java.io.*;
import java.util.Scanner;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
* @author Ahmet
*/
class MainFrame extends JFrame implements ActionListener {

    int currentAccount;
    int currentBalance;

    int regIndex = 0;
    JPanel homePan;
    JButton close;
    JLabel homeHeader;
    JButton login;
    JButton register;

    JPanel registerPan;
    JButton leaveReg;
    JLabel registerHeader;
    JTextField nameIn;
    JButton tryRegister;

    JPanel loginPan;
    JButton leaveLog;
    JLabel loginHeader;
    JLabel ibanPrompt;
    JTextField ibanIn;
    JLabel pinPrompt;
    JTextField pinIn;
    JButton tryLogin;

    JPanel loggedInPan;
    JButton leaveLogged;
    JLabel loggedHeader;
    JButton openCheck;
    JButton openWithdraw;
    JButton openDeposit;
    JButton openTransfer;

    JPanel checkPan;
    JButton leaveCheck;
    JLabel checkHeader;
    JTextField balanceOut;

    JPanel withdrawPan;
    JButton leaveWithdraw;
    JLabel withdrawPrompt;
    JTextField withdrawIn;
    JButton tryWithdraw;

    JPanel depositPan;
    JButton leaveDeposit;
    JLabel depositHeader;
    JTextField depositIn;
    JButton tryDeposit;

    JPanel transferPan;
    JButton leaveTransfer;
    JLabel transferHeader;
    JLabel transIbanPrompt;
    JTextField transIbanIn;
    JLabel transAmountPrompt;
    JTextField transAmount;
    JButton tryTransfer;

    JPanel mainPan;

    private Bank bank;

    MainFrame() throws IOException {
        regIndex = initializeRegIndex();
        bank = new Bank();
        bank.initializeAccounts("finalguibank.getBankKontos().txt");

        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Die Bank");
        addWindowListener(new WindowAdapter() {
            public void windowClosing(WindowEvent e) {
                try {
                    BankLogger.logBank(bank);
                    logRegIndex(regIndex);
                } catch (IOException ex) {
                    Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
                }
            }
        });

        Dimension screenSize = Toolkit.getDefaultToolkit().getScreenSize();
        setSize(screenSize);
        close = new JButton("Beenden");
        close.addActionListener(this);
        close.setActionCommand("close");
        homeHeader = new JLabel("Wilkommen in der Bank");
        login = new JButton("Einloggen");
        login.addActionListener(this);
        login.setActionCommand("login");
        register = new JButton("Registrieren");
        register.addActionListener(this);
        register.setActionCommand("register");
        homePan = new JPanel();
        homePan.add(close);
        homePan.add(homeHeader);
        homePan.add(login);
        homePan.add(register);
        homePan.setVisible(true);

        leaveReg = new JButton("<=");
        leaveReg.addActionListener(this);
        leaveReg.setActionCommand("leaveReg");
        registerHeader = new JLabel("Geben sie Ihren Namen ein, um sich zu registrieren");
        nameIn = new JTextField(15);
        tryRegister = new JButton("registrieren");
        tryRegister.addActionListener(this);
        tryRegister.setActionCommand("tryRegister");
        registerPan = new JPanel();
        registerPan.add(leaveReg);
        registerPan.add(registerHeader);
        registerPan.add(nameIn);
        registerPan.add(tryRegister);
        registerPan.setVisible(false);

        leaveLog = new JButton("<=");
        leaveLog.addActionListener(this);
        leaveLog.setActionCommand("leaveLog");
        loginHeader = new JLabel("Geben Sie ihre Kontonummer und PIN ein um sich anzumelden");
        ibanPrompt = new JLabel("Kontonummer:");
        ibanIn = new JTextField(6);
        pinPrompt = new JLabel("PIN: ");
        pinIn = new JTextField(6);
        tryLogin = new JButton("einloggen");
        tryLogin.addActionListener(this);
        tryLogin.setActionCommand("tryLogin");
        loginPan = new JPanel();
        loginPan.add(leaveLog);
        loginPan.add(loginHeader);
        loginPan.add(ibanPrompt);
        loginPan.add(ibanIn);
        loginPan.add(pinPrompt);
        loginPan.add(pinIn);
        loginPan.add(tryLogin);
        loginPan.setVisible(false);

        leaveLogged = new JButton("<=");
        leaveLogged.addActionListener(this);
        leaveLogged.setActionCommand("leaveLogged");
        loggedHeader = new JLabel("Wilkommen");
        openCheck = new JButton("Kontostand einsehen");
        openCheck.addActionListener(this);
        openCheck.setActionCommand("openCheck");
        openWithdraw = new JButton("Betrag auszahlen");
        openWithdraw.addActionListener(this);
        openWithdraw.setActionCommand("openWithdraw");
        openDeposit = new JButton("Betrag einzahlen");
        openDeposit.addActionListener(this);
        openDeposit.setActionCommand("openDeposit");
        openTransfer = new JButton("Betrag überweisen");
        openTransfer.addActionListener(this);
        openTransfer.setActionCommand("openTransfer");
        loggedInPan = new JPanel();
        loggedInPan.add(leaveLogged);
        loggedInPan.add(loggedHeader);
        loggedInPan.add(openCheck);
        loggedInPan.add(openWithdraw);
        loggedInPan.add(openDeposit);
        loggedInPan.add(openTransfer);
        loggedInPan.setVisible(false);

        leaveCheck = new JButton("<=");
        leaveCheck.addActionListener(this);
        leaveCheck.setActionCommand("leaveCheck");
        checkHeader = new JLabel("Ihr Kontostand beträgt: ");
        balanceOut = new JTextField(15);
        balanceOut.setEditable(false);
        checkPan = new JPanel();
        checkPan.add(leaveCheck);
        checkPan.add(checkHeader);
        checkPan.add(balanceOut);
        checkPan.setVisible(false);

        leaveWithdraw = new JButton("<=");
        leaveWithdraw.addActionListener(this);
        leaveWithdraw.setActionCommand("leaveWithdraw");
        withdrawPrompt = new JLabel("Geben Sie den Betrag an den Sie abheben möchten!");
        withdrawIn = new JTextField(10);
        tryWithdraw = new JButton("abheben");
        tryWithdraw.addActionListener(this);
        tryWithdraw.setActionCommand("tryWithdraw");
        withdrawPan = new JPanel();
        withdrawPan.add(leaveWithdraw);
        withdrawPan.add(withdrawPrompt);
        withdrawPan.add(withdrawIn);
        withdrawPan.add(tryWithdraw);
        withdrawPan.setVisible(false);

        leaveDeposit = new JButton("<=");
        leaveDeposit.addActionListener(this);
        leaveDeposit.setActionCommand("leaveDeposit");
        depositHeader = new JLabel("Geben Sie den Betrag an, den Sie einzahlen möchten!");
        depositIn = new JTextField(10);
        tryDeposit = new JButton("überweisen");
        tryDeposit.addActionListener(this);
        tryDeposit.setActionCommand("tryDeposit");
        depositPan = new JPanel();
        depositPan.add(leaveDeposit);
        depositPan.add(depositHeader);
        depositPan.add(depositIn);
        depositPan.add(tryDeposit);
        depositPan.setVisible(false);

        leaveTransfer = new JButton("<=");
        leaveTransfer.addActionListener(this);
        leaveTransfer.setActionCommand("leaveTransfer");
        transferHeader = new JLabel("Geben sie den Empfänger und den Betrag der Überweisung an!");
        transIbanPrompt = new JLabel("Kontonummer des Empfängers: ");
        transIbanIn = new JTextField(6);
        transAmountPrompt = new JLabel("Betrag: ");
        transAmount = new JTextField(6);
        tryTransfer = new JButton("überweisen");
        tryTransfer.addActionListener(this);
        tryTransfer.setActionCommand("tryTransfer");
        transferPan = new JPanel();
        transferPan.add(leaveTransfer);
        transferPan.add(transferHeader);
        transferPan.add(transIbanPrompt);
        transferPan.add(transIbanIn);
        transferPan.add(transAmountPrompt);
        transferPan.add(transAmount);
        transferPan.add(tryTransfer);
        transferPan.setVisible(false);

        mainPan = new JPanel();
        mainPan.add(homePan);
        mainPan.add(registerPan);
        mainPan.add(loginPan);
        mainPan.add(loggedInPan);
        mainPan.add(checkPan);
        mainPan.add(withdrawPan);
        mainPan.add(depositPan);
        mainPan.add(transferPan);
        add(mainPan);

    }

    public void actionPerformed(ActionEvent evt) {
        if (evt.getActionCommand().equals("close")) {
            try {
                BankLogger.logBank(bank);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            try {
                logRegIndex(regIndex);
            } catch (IOException ex) {
                Logger.getLogger(MainFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            System.exit(0);
        } else if (evt.getActionCommand().equals("login")) {
            homePan.setVisible(false);
            loginPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("register")) {
            homePan.setVisible(false);
            registerPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openCheck")) {
            balanceOut.setText(Integer.toString(bank.getBankKontos()[currentAccount].gibKontoStand()));
            loggedInPan.setVisible(false);
            checkPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openWithdraw")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("openDeposit")) {
            loggedInPan.setVisible(false);
            withdrawPan.setVisible(true);
            validate();

        } else if (evt.getActionCommand().equals("openTransfer")) {
            loggedInPan.setVisible(false);
            transferPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("tryRegister")) {
            if (nameIn.getText().isEmpty()) {
                int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihren Namen ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            } else if (!(nameIn.getText().isEmpty())) {
                String iban = String.valueOf((int) (Math.random() * 10000 + 1000));
                String pin = String.valueOf((int) (Math.random() * 10000 + 1000));
                String name = nameIn.getText().trim();
                bank.getBankKontos()[regIndex] = new BankKonto(name, iban, 0, pin);
                int input = JOptionPane.showOptionDialog(null, "Ihr Konto wurde erfolgreich erstellt \n Ihre Kontonummer: " + bank.getBankKontos()[regIndex].gibKontoNummer() + "\n Ihre PIN: " + bank.getBankKontos()[regIndex].gibKontoPIN(), "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                regIndex++;
                if (input == JOptionPane.OK_OPTION) {
                    registerPan.setVisible(false);
                    homePan.setVisible(true);
                    nameIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryLogin")) {
            if (checkInput(ibanIn.getText()) && checkInput(pinIn.getText())) {

                if (ibanIn.getText().isEmpty() || pinIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                boolean checkLogin = false;

                for (int i = 0; i <= bank.getBankKontos().length - 1; i++) {

                    if (bank.getBankKontos()[i] == null) {
                        checkLogin = false;
                    } else if (((ibanIn.getText().trim().equals(bank.getBankKontos()[i].gibKontoNummer())) && (pinIn.getText().trim().equals(bank.getBankKontos()[i].gibKontoPIN())))) {
                        currentAccount = i;
                        checkLogin = true;
                        currentBalance = bank.getBankKontos()[currentAccount].gibKontoStand();
                        break;
                    }
                }

                if (checkLogin) {
                    loginPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryWithdraw")) {
            if (checkInput(withdrawIn.getText())) {

                if (withdrawIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(withdrawIn.getText());
                currentBalance = bank.getBankKontos()[currentAccount].gibKontoStand();
                bank.getBankKontos()[currentAccount].hebeGeldAb(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " abgehoben", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    withdrawPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }
            }
        } else if (evt.getActionCommand().equals("tryDeposit")) {
            if (checkInput(depositIn.getText())) {
                if (depositIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }
                int amountChunk = Integer.parseInt(depositIn.getText());
                bank.getBankKontos()[currentAccount].zahleGeldEin(amountChunk);
                int input = JOptionPane.showOptionDialog(null, amountChunk + " eingezahlt", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                if (input == JOptionPane.OK_OPTION) {
                    depositPan.setVisible(false);
                    loggedInPan.setVisible(true);
                    withdrawIn.setText("");
                    validate();
                }

            }
        } else if (evt.getActionCommand().equals("tryTransfer")) {
            if (checkInput(transAmount.getText()) && checkInput(transIbanIn.getText())) {
                if (transAmount.getText().isEmpty() || transIbanIn.getText().isEmpty()) {
                    int input = JOptionPane.showOptionDialog(null, "Geben Sie bitte Ihre Daten ein!", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                }

                int result = bank.findAccount(transIbanIn.getText());
                if (result <= -2) {
                    int input = JOptionPane.showOptionDialog(null, "Etwas sehr schlimmes ist passiert", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transIbanIn.setText("");
                        transAmount.setText("");
                        validate();
                    }
                } else if (result == -1) {
                    int input = JOptionPane.showOptionDialog(null, "ÜberweiseungsKonto nicht gefunden", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);

                } else if (result >= 0) {
                    bank.getBankKontos()[currentAccount].hebeGeldAb(Integer.parseInt(transAmount.getText()));
                    bank.getBankKontos()[result].zahleGeldEin(Integer.parseInt(transAmount.getText()));
                    int input = JOptionPane.showOptionDialog(null, "Überweisung erfolgreich", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
                    if (input == JOptionPane.OK_OPTION) {
                        transferPan.setVisible(false);
                        loggedInPan.setVisible(true);
                        transAmount.setText("");
                        transIbanIn.setText("");
                        validate();
                    }
                }
            }
        } else if (evt.getActionCommand().equals("leaveReg")) {
            if (evt.getActionCommand().equals("leaveReg")) {
                registerPan.setVisible(false);
            }
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveLog")) {
            loginPan.setVisible(false);
            homePan.setVisible(true);
        } else if (evt.getActionCommand().equals("leaveLogged")) {
            loggedInPan.setVisible(false);
            homePan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveCheck")) {
            checkPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveWithdraw")) {
            withdrawPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveDeposit")) {
            depositPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        } else if (evt.getActionCommand().equals("leaveTransfer")) {
            transferPan.setVisible(false);
            loggedInPan.setVisible(true);
            validate();
        }
    }

    public int initializeRegIndex() throws FileNotFoundException {
        Scanner scan = new Scanner(new File("regIndex.txt"));
        //   Scanner scan = new Scanner("finalguibank.getBankKontos().txt");
        int regIndx = 0;
        int currLine = 0;
        while (scan.hasNextLine()) {
            String input = scan.nextLine();
            regIndx = Integer.parseInt(input);
            currLine++;
        }
        return regIndx;
    }

    public void logRegIndex(int regIndx) throws IOException {
        BufferedWriter bw = null;
        FileWriter fw = null;

        try {
// BankKonto Konto = new BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN)

            fw = new FileWriter(new File("regIndex.txt"));
            bw = new BufferedWriter(fw);

            String content = Integer.toString(regIndx);
            bw.write(content);
        } catch (IOException e) {

            e.printStackTrace();

        } finally {

            try {

                if (bw != null) {
                    bw.close();
                }

                if (fw != null) {
                    fw.close();
                }

            } catch (IOException ex) {

                ex.printStackTrace();

            }
        }

    }

    public boolean checkInput(String inputs) {
        boolean converted;
        try {
            Integer.parseInt(inputs);
            converted = true;

        } catch (NumberFormatException e) {
            int input = JOptionPane.showOptionDialog(null, "Daten ungültig", "The title", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE, null, null, null);
            converted = false;

        }

        return converted;
    }

}

public class FinalGUI {

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) throws IOException {
        // TODO code application logic here
        MainFrame frame = new MainFrame();
        frame.setLocationRelativeTo(null);
        frame.setVisible(true);

    }

}

Neue Bank Klasse
Code:
import java.io.File;
import java.io.FileNotFoundException;
import java.util.Scanner;

public class Bank {

    private BankKonto[] bankKontos;

    public Bank() {
    }

    /**
     * @param bankKontos
     */
    public Bank(BankKonto[] bankKontos) {
        this.bankKontos = bankKontos;
    }

    public BankKonto[] getBankKontos() {
        return bankKontos;
    }

    public void setBankKontos(BankKonto[] bankKontos) {
        this.bankKontos = bankKontos;
    }

    public int findAccount(String ibanStr) {
        int result = -2;
        for (int i = 0; i <= bankKontos.length - 1; i++) {

            if (bankKontos[i] == null) {
                result = -1;
            } else if (((ibanStr.trim().equals(bankKontos[i].gibKontoNummer())))) {
                result = i;
                break;
            }
        }

        return result;
    }

    public void initializeAccounts(String filename) throws FileNotFoundException {
        Scanner scan = new Scanner(new File(filename));
        //   Scanner scan = new Scanner("finalguiaccounts.txt");
        String[] inputs = new String[4];
        int currLine = 0;
        while (scan.hasNextLine()) {
            String input = scan.nextLine();
            inputs = StringUtil.splitString(input);
            bankKontos[currLine] = new BankKonto(inputs[0], inputs[1], Integer.parseInt(inputs[2]), inputs[3]);
            currLine++;
        }

    }
}

Neue BankKonto Klasse
Code:
public class BankKonto {

    private String kontoInhaber, kontoNummer, kontoPIN;
    private int kontoStand;

    BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN) {
        kontoInhaber = ktoInhaber;
        kontoNummer = ktoNummer;
        kontoPIN = ktoPIN;
        kontoStand = start;

    }

    void hebeGeldAb(int betrag) {
        kontoStand = kontoStand - betrag;
    }

    void zahleGeldEin(int betrag) {
        kontoStand = kontoStand + betrag;
    }

    String gibKontoNummer() {
        return kontoNummer;

    }

    String gibKontoPIN() {
        return kontoPIN;
    }

    String gibName() {
        return kontoInhaber;

    }

    int gibKontoStand() {
        return kontoStand;
    }

}

BankLogger Klasse
Code:
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;

public class BankLogger {

    public static void logBank(Bank bank) throws IOException {
        BufferedWriter bw = null;
        FileWriter fw = null;
        if (bank != null) {

            try {
// BankKonto Konto = new BankKonto(String ktoInhaber, String ktoNummer, int start, String ktoPIN)

                fw = new FileWriter(new File("finalguibank.getBankKontos().txt"));
                bw = new BufferedWriter(fw);
                for (BankKonto bankKonto : bank.getBankKontos())
                    if (bankKonto != null) {
                        String content = bankKonto.gibName() + "," + bankKonto.gibKontoNummer() + "," + bankKonto.gibKontoStand() + "," + bankKonto.gibKontoPIN();
                        bw.write(content);
                        bw.newLine();
                    }

            } catch (IOException e) {

                e.printStackTrace();

            } finally {

                try {

                    if (bw != null) {
                        bw.close();
                    }

                    if (fw != null) {
                        fw.close();
                    }

                } catch (IOException ex) {

                    ex.printStackTrace();

                }
            }
        }
    }
}

StringUtil Klasse

Code:
public class StringUtil {

    public static String[] splitString(String input) {
        String[] strings = new String[4];
        int for1,
                for2,
                for3;

        String String1,
                String2,
                String3,
                String4;
        for1 = 0;
        for2 = 0;
        for3 = 0;
        String1 = "";
        String2 = "";
        String3 = "";
        String4 = "";
        for (int i = 0; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for1 = String1.length() + 1;
                break;
            } else {
                String1 = String1 + input.charAt(i);
            }
        }
        for (int i = for1; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for2 = for1 + String2.length() + 1;
                break;
            } else {
                String2 = String2 + input.charAt(i);
            }
        }
        for (int i = for2; i <= input.length(); i++) {
            if (input.charAt(i) == (',')) {
                for3 = for2 + String3.length() + 1;
                break;
            } else {
                String3 = String3 + input.charAt(i);
            }

        }
        for (int i = for3; i <= input.length(); i++) {
            if (i >= input.length() - 1) {
                String4 = String4 + input.charAt(i);
                break;
            }

            String4 = String4 + input.charAt(i);

        }
        strings[0] = String1;
        strings[1] = String2;
        strings[2] = String3;
        strings[3] = String4;
       
        return strings;
    }

}

Erreichst du das Gleiche mit
Code:
 public static String[] splitString(String input) {
       return input.split(",",-1); // oder input.split(",") falls leere Einträge ignoriert werden sollen
    }

So könnte ein Anfang für ein "brauchbares" Design aussehen.
 

Kababär

Top Contributor
Muss ich etwa für jede Klasse eine eigene .java Datei erstellen und sie dann importieren?
Nein. Wenn du eine Klasse nur innerhalb einer anderen Klasse brauchst,
dann kannst du auch folgendes machen:
Code:
public class ClassA {
}

class ClassB {
   
}
Wie du schon gesagt hast, darf in einer .java-Datei nur eine public class sein, die nicht static ist.
Wenn du aber ClassB in einem anderen package verwenden willst, muss diese public sein.
Und da sich in deinem Projekt vieles ändern kann und auch dadurch die package-Struktur ändern kann, ist es empfehlenswert, für jede Klasse eine eigene java-Datei zu erstellen.
So kannst du auch flexibel und einfach auf Änderungen reagieren.
 

mrBrown

Super-Moderator
Mitarbeiter
Die Sache die ich nicht verstehe ist, dass ich pro .java Datei nur eine public class verwenden darf. Muss ich etwa für jede Klasse eine eigene .java Datei erstellen und sie dann importieren?
Ratsam ist das - ja.
Importen muss man aber nur, wenn die auch in einem anderem package liegt.

Nein. Wenn du eine Klasse nur innerhalb einer anderen Klasse brauchst,
dann kannst du auch folgendes machen:
Würde ich als schlechten Stil sehen - wenn, dann innere Klassen.
 
Ähnliche Java Themen

Ähnliche Java Themen


Oben