From 203b24a4c1ebfbca10213e668336514b3595652e Mon Sep 17 00:00:00 2001
From: Dennis Eisold <de@itstall.de>
Date: Fri, 6 Dec 2019 09:29:56 +0100
Subject: [PATCH] Buttons als Array umgebaut. Tasten leuchten nach Fehler nicht
 mehr. Textarea autoscroll eingebaut. Jetzt endlich fertig?

---
 .../java/projekt/enigma/GuiController.java    | 1613 ++++++++---------
 1 file changed, 756 insertions(+), 857 deletions(-)

diff --git a/src/main/java/projekt/enigma/GuiController.java b/src/main/java/projekt/enigma/GuiController.java
index f35487c..c2895d0 100644
--- a/src/main/java/projekt/enigma/GuiController.java
+++ b/src/main/java/projekt/enigma/GuiController.java
@@ -1,5 +1,7 @@
 package projekt.enigma;
 
+import javafx.beans.value.ChangeListener;
+import javafx.beans.value.ObservableValue;
 import javafx.concurrent.Task;
 import javafx.event.ActionEvent;
 import javafx.fxml.FXML;
@@ -22,864 +24,761 @@ import java.util.ArrayList;
 
 public class GuiController {
 
-    //region Klassenvariablen
-    private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
-    private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14", "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
-    private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N", "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
-    @FXML
-    private static ToggleButton[] tBtnPort;
-    private String[] empfangeneNachricht;
-    private String textEingabe;
-    private String textCodiert;
-    private char chiffrierterBuchstabe;
-    private boolean resetDisplay;
-    private Codierer codierer;
-
-    //region GUI-Elemente
-    //deklariert die benötigten Buttons
-    @FXML
-    private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
-            btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
-    //endregion
-    //deklariert die benötigten Kreise
-    @FXML
-    private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
-            circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
-    //deklariert die benötigten Label
-    @FXML
-    private Label lblSpruchschluessel, lblKenngruppe;
-    //deklariert die MenueButtons
-    @FXML
-    private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
-            mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
-    //deklariert die benötigten Textfelder
-    @FXML
-    private TextArea tfCodiert, tfKlartext;
-    //deklariert benötigtes GridPane
-    @FXML
-    private ChkBoxGridPane[] chkBoxGridPane;
-    @FXML
-    private GridPane mainGrid;
-    @FXML
-    private AnchorPane anchorPane;
-
-    /**
-     * Initialisiert die Elemente GUI und setzt deren Startwerte
-     */
-    @FXML
-    void initialize() {
-        // Variablen setzen
-        textEingabe = "";
-        textCodiert = "";
-        resetDisplay = true;
-
-        //Einträge für Walzen
-        menu(mBtnWalzPos1, walzenNr);
-        menu(mBtnWalzPos2, walzenNr);
-        menu(mBtnWalzPos3, walzenNr);
-
-        //Einträge für die Ringe
-        menu(mBtnNotchPos1, ringNr);
-        menu(mBtnNotchPos2, ringNr);
-        menu(mBtnNotchPos3, ringNr);
-
-        //Einträge für die Startpositionen
-        menu(mBtnStartPos1, position);
-        menu(mBtnStartPos3, position);
-        menu(mBtnStartPos2, position);
-    }
-    //endregion
-
-    //region Init
-
-    /**
-     * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
-     *
-     * @param button : Button für die die Einträge erstellt werden sollen
-     */
-    private void menu(MenuButton button, String[] str) {
-        ArrayList<MenuItem> mItem = new ArrayList<>();
-
-        for (int i = 0; i < str.length; i++) {
-            // Eintrag aus str der Arraylist mi hinzufügen
-            mItem.add(new MenuItem(str[i]));
-            // MenuItem mi dem Button button hinzufügen
-            button.getItems().add(mItem.get(i));
-            int finalI = i;
-            // Listener für die einzelnen Einträge
-            mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
-        }
-    }
-
-    /**
-     * Erzeugt Buttons um die Steckverbindungen zu auszuwählen
-     */
-    private void myToggleButtons() {
-        if (chkBoxGridPane != null) {
-            for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
-                anchorPane.getChildren().remove(boxGridPane);
-            }
-        }
-        chkBoxGridPane = new ChkBoxGridPane[10];
-
-        final ToggleGroup cabelConnect = new ToggleGroup();
-        tBtnPort = new ToggleButton[chkBoxGridPane.length];
-
-        for (int i = 0; i < chkBoxGridPane.length; i++) {
-            tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" + this.codierer.fetchSteckverbindungen()[i][1]);
-            tBtnPort[i].setToggleGroup(cabelConnect);
-            tBtnPort[i].setMinWidth(50.0);
-            GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
-            mainGrid.add(tBtnPort[i], i + 1, 8);
-            this.createPortPane(i);
-            chkBoxGridPane[i].setVisible(false);
-        }
-        // ToggleButtonGroup Listener
-        cabelConnect.selectedToggleProperty().
-                addListener((observable, oldValue, newValue) -> {
-
-                    for (int j = 0; j < chkBoxGridPane.length; j++) {
-
-                        if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
-                            this.createPortPane(j);
-                        } else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
-                            if (chkBoxGridPane[j] != null) {
-                                chkBoxGridPane[j].setVisible(false);
-                            }
-                        }
-                    }
-                });
-    }
-
-    /**
-     * Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
-     *
-     * @param port => entspricht der Position des gewählten ToggleButton
-     */
-    private void createPortPane(int port) {
-
-        if (chkBoxGridPane[port] != null) {
-            anchorPane.getChildren().remove(chkBoxGridPane[port]);
-        }
-        chkBoxGridPane[port] = new ChkBoxGridPane(
-                this.codierer,
-                port,
-                tBtnPort[port]);
-        chkBoxGridPane[port].setVisible(false);
-        chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
-        chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
-        chkBoxGridPane[port].setPrefWidth(85.0);
-        chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
-        chkBoxGridPane[port].setAlignment(Pos.CENTER);
-        chkBoxGridPane[port].setLayoutX(
-                (anchorPane.getWidth() / 12) * (port + 1) -
-                        ((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
-        chkBoxGridPane[port].setLayoutY(
-                mainGrid.getLayoutY() + ((anchorPane.getHeight() -
-                        mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
-
-        anchorPane.getChildren().add(chkBoxGridPane[port]);
-        chkBoxGridPane[port].setVisible(true);
-    }
-
-    /**
-     * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
-     * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
-     * durch Aufruf der Methode leuchten.
-     *
-     * @param e => übergibt den zuletzt losgelassenen Button
-     */
-    @FXML
-    void tasteRauf(MouseEvent e) {
-        if (e.getSource() == btnA) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnB) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnC) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnD) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnE) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnF) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnG) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnH) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnI) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnJ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnK) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnL) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnM) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnN) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnO) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnP) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnQ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnR) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnS) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnT) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnU) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnV) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnW) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnX) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnY) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-        if (e.getSource() == btnZ) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
-    }
-    //endregion
-
-    //region EventHandler/Listener
-
-    /**
-     * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
-     * Auswertung welche Buchstaben-Taste gedrückt ist.
-     * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
-     * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
-     * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
-     *
-     * @param e => übergibt den momentan gedrückten Buttons
-     */
-    @FXML
-    void tasteRunter(MouseEvent e) {
-        if (e.getSource() == btnA) {
-            setText(btnA);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnB) {
-            setText(btnB);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnC) {
-            setText(btnC);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnD) {
-            setText(btnD);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnE) {
-            setText(btnE);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnF) {
-            setText(btnF);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnG) {
-            setText(btnG);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnH) {
-            setText(btnH);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnI) {
-            setText(btnI);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnJ) {
-            setText(btnJ);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnK) {
-            setText(btnK);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnL) {
-            setText(btnL);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnM) {
-            setText(btnM);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnN) {
-            setText(btnN);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnO) {
-            setText(btnO);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnP) {
-            setText(btnP);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnQ) {
-            setText(btnQ);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnR) {
-            setText(btnR);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnS) {
-            setText(btnS);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnT) {
-            setText(btnT);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnU) {
-            setText(btnU);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnV) {
-            setText(btnV);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnW) {
-            setText(btnW);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnX) {
-            setText(btnX);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnY) {
-            setText(btnY);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-        if (e.getSource() == btnZ) {
-            setText(btnZ);
-            leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
-        }
-    }
-
-    /**
-     * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
-     * Funktionsaufruf entsprechend des gedrückten Button
-     *
-     * @param e => ActionEvent des auslösenden Button
-     */
-    @FXML
-    private void gedrueckteTaste(ActionEvent e) {
-        if (e.getSource() == btnSenden) {
-            if (tfCodiert.getText().equals("")) {
-                new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
-                        "Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
-            } else {
-                sendeFunkspruch();
-            }
-        }
-        if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
-        if (e.getSource() == btnDelete) loeschen();
-        if (e.getSource() == btnReset) {
-            codierer.resetHardware();
-            this.resetDisplay = true;
-            this.lblSpruchschluessel.setText("");
-            this.setzeTagesSchluessel();
-        }
-    }
-
-    /**
-     * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
-     *
-     * @param leuchte       => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
-     * @param shiningLetter => "AN"  -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
-     *                      "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
-     */
-    private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
-        if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
-        else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
-            leuchte.setStyle("-fx-background-color: grey");
-            leuchte.setStyle("-fx-border-color:  #000000");
-        }
-    }
-    //endregion
-
-    //region Methoden
-
-    /**
-     * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
-     *
-     * @param chiffLetter => chiffrierter Buchstabe
-     * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
-     */
-    private Circle chiffCircle(char chiffLetter) {
-        switch (chiffLetter) {
-            case 'A':
-                return circA;
-            case 'B':
-                return circB;
-            case 'C':
-                return circC;
-            case 'D':
-                return circD;
-            case 'E':
-                return circE;
-            case 'F':
-                return circF;
-            case 'G':
-                return circG;
-            case 'H':
-                return circH;
-            case 'I':
-                return circI;
-            case 'J':
-                return circJ;
-            case 'K':
-                return circK;
-            case 'L':
-                return circL;
-            case 'M':
-                return circM;
-            case 'N':
-                return circN;
-            case 'O':
-                return circO;
-            case 'P':
-                return circP;
-            case 'Q':
-                return circQ;
-            case 'R':
-                return circR;
-            case 'S':
-                return circS;
-            case 'T':
-                return circT;
-            case 'U':
-                return circU;
-            case 'V':
-                return circV;
-            case 'W':
-                return circW;
-            case 'X':
-                return circX;
-            case 'Y':
-                return circY;
-            case 'Z':
-                return circZ;
-        }
-        return null;
-    }
-
-    /**
-     * Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
-     *
-     * @param mBtn : MenuButton der Walze
-     * @param mItm : MenuItem
-     */
-    private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
-        if (mBtn.getId().equals(mBtnStartPos1.getId())) {
-            setzePosition(1, mItm.getText().charAt(0));
-            this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
-        }
-        if (mBtn.getId().equals(mBtnStartPos2.getId())) {
-            setzePosition(2, mItm.getText().charAt(0));
-            this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
-        }
-        if (mBtn.getId().equals(mBtnStartPos3.getId())) {
-            setzePosition(3, mItm.getText().charAt(0));
-            this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
-        }
-        if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
-            setzeWalze(1, mItm.getText());
-            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
-                    !mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
-                this.codierer.setzeWalzeNr(0,
-                        convertRoemischToZahl(mItm.getText()) + 1,
-                        mBtnNotchPos1.getText().charAt(0));
-            } else {
-                setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
-                new Fehler().showErrorDialog("error",
-                        "Walze nicht gefunden",
-                        "Es scheint so das wir von jeder Walze nur eine da haben");
-            }
-        }
-        if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
-            setzeWalze(2, mItm.getText());
-            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
-                    !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
-                this.codierer.setzeWalzeNr(1,
-                        convertRoemischToZahl(mItm.getText()) + 1,
-                        mBtnNotchPos2.getText().charAt(0));
-            } else {
-                setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
-                new Fehler().showErrorDialog("error",
-                        "Walze nicht gefunden",
-                        "Es scheint so das wir von jeder Walze nur eine da haben");
-            }
-        }
-        if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
-            setzeWalze(3, mItm.getText());
-            if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
-                    !mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
-                this.codierer.setzeWalzeNr(2,
-                        convertRoemischToZahl(mItm.getText()) + 1,
-                        mBtnNotchPos3.getText().charAt(0));
-            } else {
-                setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
-                new Fehler().showErrorDialog("error",
-                        "Walze nicht gefunden",
-                        "Es scheint so das wir von jeder Walze nur eine da haben");
-            }
-        }
-        if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
-            setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
-            this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
-        }
-        if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
-            setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
-            this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
-        }
-        if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
-            setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
-            this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
-        }
-        tfCodiert.setText("");
-        tfKlartext.setText("");
-    }
-
-    /**
-     * Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
-     * der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
-     */
-    private void loeschen() {
-        if (textEingabe.length() == 0) {
-            tfKlartext.setText("");
-            tfCodiert.setText("");
-        } else {
-            textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
-            textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
-            tfKlartext.setText(textEingabe);
-            tfCodiert.setText(textCodiert);
-            codierer.letztesZeichenLoeschen();
-            mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
-            mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
-            mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
-        }
-    }
-
-    /**
-     * Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
-     * sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
-     */
-    private void empfangeFunkspruch() {
-        progressDialogue("rx");
-
-        try {
-            if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
-                setzeTagesSchluessel();
-                tfKlartext.setText(this.empfangeneNachricht[2]);
-                tfCodiert.setText(this.empfangeneNachricht[1]);
-                resetDisplay = true;
-
-                // Spruchschluessel in das Feld lblSpruchschluessel schreiben
-                lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
-            }
-        } catch (NullPointerException ignored) {
-            new Fehler().showErrorDialog(
-                    "warning",
-                    "Keiner schreibt dir...",
-                    "Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
-        }
-    }
-
-    /**
-     * Senden der Nachricht mit Hilfe der Klasse Codierer
-     * Löscht die Textfelder tfKlartext und tfCodiert
-     */
-    private void sendeFunkspruch() {
-        this.tfKlartext.setText("");
-        this.tfCodiert.setText("");
-
-        progressDialogue("tx");
-    }
-
-    /**
-     * Methode die das ProgressDialog Fenster erstellt und verwaltet
-     *
-     * @param strRxTx : String : RX => empfangen
-     *                TX => senden
-     */
-    private void progressDialogue(String strRxTx) {
-        Task copyWorker = createWorker(strRxTx);
-
-        ProgressIndicator pi = new ProgressIndicator();
-        pi.setProgress(-1);
-
-        ProgressDialog dialog = new ProgressDialog(copyWorker);
-        dialog.initStyle(StageStyle.TRANSPARENT);
-        dialog.setTitle("Kommunikation zum Funkraum");
-        if (strRxTx.equals("rx")) {
-            dialog.setContentText("Empfange Nachricht");
-        } else if (strRxTx.equals("tx")) {
-            dialog.setContentText("Sende Nachricht");
-        }
-        dialog.setHeaderText(null);
-        dialog.setGraphic(pi);
-        dialog.initStyle(StageStyle.UTILITY);
-        new Thread(copyWorker).start();
-        dialog.showAndWait();
-    }
-
-    /**
-     * Thread Worker für Nachricht senden / empfangen
-     *
-     * @param strRxTx : String : RX => empfangen
-     *                TX => senden
-     * @return boolean
-     */
-    private Task createWorker(String strRxTx) {
-        return new Task() {
-            @Override
-            protected Object call() {
-                if (strRxTx.equals("rx")) {
-                    empfangeneNachricht = codierer.empfangeNachricht();
-                } else if (strRxTx.equals("tx")) {
-                    try {
-                        codierer.sendeNachricht();
-                    } catch (IOException e) {
-                        e.printStackTrace();
-                    }
+	//region Klassenvariablen
+	private final static String[] walzenNr = {"I", "II", "III", "IV", "V"};
+	private final static String[] ringNr = {"1", "2", "3", "4", "5", "6", "7", "8", "9", "10", "11", "12", "13", "14",
+            "15", "16", "17", "18", "19", "20", "21", "22", "23", "24", "25", "26"};
+	private final static String[] position = {"A", "B", "C", "D", "E", "F", "G", "H", "I", "J", "K", "L", "M", "N",
+            "O", "P", "Q", "R", "S", "T", "U", "V", "W", "X", "Y", "Z"};
+	@FXML
+	private static ToggleButton[] tBtnPort;
+	private String[] empfangeneNachricht;
+	private String textEingabe;
+	private String textCodiert;
+	private char chiffrierterBuchstabe;
+	private boolean resetDisplay;
+	private Codierer codierer;
+
+	//region GUI-Elemente
+	//deklariert die benötigten Buttons
+	@FXML
+	private Button btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN, btnO, btnP, btnQ,
+			btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset;
+	@FXML
+	private Button[] btnArray;
+	//endregion
+	//deklariert die benötigten Kreise
+	@FXML
+	private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
+			circO, circP, circQ, circR, circS, circT, circU, circV, circW, circX, circY, circZ;
+	//deklariert die benötigten Label
+	@FXML
+	private Label lblSpruchschluessel, lblKenngruppe;
+	//deklariert die MenueButtons
+	@FXML
+	private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
+			mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
+	//deklariert die benötigten Textfelder
+	@FXML
+	private TextArea tfCodiert, tfKlartext;
+	//deklariert benötigtes GridPane
+	@FXML
+	private ChkBoxGridPane[] chkBoxGridPane;
+	@FXML
+	private GridPane mainGrid;
+	@FXML
+	private AnchorPane anchorPane;
+
+	/**
+	 * Initialisiert die Elemente GUI und setzt deren Startwerte
+	 */
+	@FXML
+	void initialize() {
+		// Variablen setzen
+		textEingabe = "";
+		textCodiert = "";
+		resetDisplay = true;
+
+		//Einträge für Walzen
+		menu(mBtnWalzPos1, walzenNr);
+		menu(mBtnWalzPos2, walzenNr);
+		menu(mBtnWalzPos3, walzenNr);
+
+		//Einträge für die Ringe
+		menu(mBtnNotchPos1, ringNr);
+		menu(mBtnNotchPos2, ringNr);
+		menu(mBtnNotchPos3, ringNr);
+
+		//Einträge für die Startpositionen
+		menu(mBtnStartPos1, position);
+		menu(mBtnStartPos3, position);
+		menu(mBtnStartPos2, position);
+		btnArray = new Button[]{btnA, btnB, btnC, btnD, btnE, btnF, btnG, btnH, btnI, btnJ, btnK, btnL, btnM, btnN,
+                btnO, btnP, btnQ, btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ};
+
+        tfKlartext.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
+                tfKlartext.setScrollTop(Double.MAX_VALUE));
+        tfCodiert.textProperty().addListener((ChangeListener<Object>) (observableValue, o, t1) ->
+                tfCodiert.setScrollTop(Double.MAX_VALUE));
+	}
+	//endregion
+
+	//region Init
+
+	/**
+	 * init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
+	 *
+	 * @param button : Button für die die Einträge erstellt werden sollen
+	 */
+	private void menu(MenuButton button, String[] str) {
+		ArrayList<MenuItem> mItem = new ArrayList<>();
+
+		for (int i = 0; i < str.length; i++) {
+			// Eintrag aus str der Arraylist mi hinzufügen
+			mItem.add(new MenuItem(str[i]));
+			// MenuItem mi dem Button button hinzufügen
+			button.getItems().add(mItem.get(i));
+			int finalI = i;
+			// Listener für die einzelnen Einträge
+			mItem.get(i).setOnAction(e -> setMenuBtnText(button, mItem.get(finalI)));
+		}
+	}
+
+	/**
+	 * Erzeugt Buttons um die Steckverbindungen zu auszuwählen
+	 */
+	private void myToggleButtons() {
+		if (chkBoxGridPane != null) {
+			for (ChkBoxGridPane boxGridPane : chkBoxGridPane) {
+				anchorPane.getChildren().remove(boxGridPane);
+			}
+		}
+		chkBoxGridPane = new ChkBoxGridPane[10];
+
+		final ToggleGroup cabelConnect = new ToggleGroup();
+		tBtnPort = new ToggleButton[chkBoxGridPane.length];
+
+		for (int i = 0; i < chkBoxGridPane.length; i++) {
+			tBtnPort[i] = new ToggleButton(this.codierer.fetchSteckverbindungen()[i][0] + "" +
+                    this.codierer.fetchSteckverbindungen()[i][1]);
+			tBtnPort[i].setToggleGroup(cabelConnect);
+			tBtnPort[i].setMinWidth(50.0);
+			GridPane.setHalignment(tBtnPort[i], HPos.CENTER);
+			mainGrid.add(tBtnPort[i], i + 1, 8);
+			this.createPortPane(i);
+			chkBoxGridPane[i].setVisible(false);
+		}
+		// ToggleButtonGroup Listener
+		cabelConnect.selectedToggleProperty().
+				addListener((observable, oldValue, newValue) -> {
+
+					for (int j = 0; j < chkBoxGridPane.length; j++) {
+
+						if (cabelConnect.getSelectedToggle() == tBtnPort[j]) {
+							this.createPortPane(j);
+						} else if (cabelConnect.getSelectedToggle() != tBtnPort[j]) {
+							if (chkBoxGridPane[j] != null) {
+								chkBoxGridPane[j].setVisible(false);
+							}
+						}
+					}
+				});
+	}
+
+	/**
+	 * Erstellt ein GridPane mit CheckBoxen an der Position des übergebenen port
+	 *
+	 * @param port => entspricht der Position des gewählten ToggleButton
+	 */
+	private void createPortPane(int port) {
+
+		if (chkBoxGridPane[port] != null) {
+			anchorPane.getChildren().remove(chkBoxGridPane[port]);
+		}
+		chkBoxGridPane[port] = new ChkBoxGridPane(
+				this.codierer,
+				port,
+				tBtnPort[port]);
+		chkBoxGridPane[port].setVisible(false);
+		chkBoxGridPane[port].setStyle("-fx-background-color: white; -fx-border-color: black;");
+		chkBoxGridPane[port].setPrefHeight(chkBoxGridPane[port].getCharSize() * 22);
+		chkBoxGridPane[port].setPrefWidth(85.0);
+		chkBoxGridPane[port].setPadding(new Insets(10, 10, 10, 10));
+		chkBoxGridPane[port].setAlignment(Pos.CENTER);
+		chkBoxGridPane[port].setLayoutX(
+				(anchorPane.getWidth() / 12) * (port + 1) -
+						((chkBoxGridPane[port].getPrefWidth() - anchorPane.getWidth() / 12) / 2));
+		chkBoxGridPane[port].setLayoutY(
+				mainGrid.getLayoutY() + ((anchorPane.getHeight() -
+						mainGrid.getLayoutY()) / 10 * 9) - chkBoxGridPane[port].getPrefHeight() - 15);
+
+		anchorPane.getChildren().add(chkBoxGridPane[port]);
+		chkBoxGridPane[port].setVisible(true);
+	}
+
+	/**
+	 * Wird ausgelöst wenn der gedrückte Button losgelassen wird.
+	 * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf grau,
+	 * durch Aufruf der Methode leuchten.
+	 *
+	 * @param e => übergibt den zuletzt losgelassenen Button
+	 */
+	@FXML
+	void tasteRauf(MouseEvent e) {
+	    for(Button btn : btnArray) {
+            if (e.getSource() == btn) leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AUS);
+        }
+	}
+	//endregion
+
+	//region EventHandler/Listener
+
+	/**
+	 * Wird ausgelöst sobald eine Taste gedrückt wird (beim drücken der Taste)
+	 * Auswertung welche Buchstaben-Taste gedrückt ist.
+	 * Übergabe des entspechenden Buchstaben als Parameter der Methode setText welche den chiffrierten Buchstaben
+	 * in der Klassen-Variablen chiffrierterBuchstabe ablegt.
+	 * Setzt die Hintergrundfarbe des Kreises mit dem chiffrierten Buchstaben auf gelb
+	 *
+	 * @param e => übergibt den momentan gedrückten Buttons
+	 */
+	@FXML
+	void tasteRunter(MouseEvent e) {
+        for(Button btn : btnArray) {
+            if (e.getSource() == btn) {
+                if (setText(btn)) {
+                    leuchten(chiffCircle(chiffrierterBuchstabe), BUCHSTABE_LEUCHTET.AN);
                 }
-
-                return true;
             }
-        };
-    }
-
-    /**
-     * Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
-     * Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
-     * Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
-     * Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
-     * Aktualisierung der Walzenstellung
-     *
-     * @param pressedButton : gedrückter Knopf
-     */
-    private void setText(Button pressedButton) {
-        if (textEingabe.length() < 250) {
-            if (this.resetDisplay) {
-                this.tfCodiert.setText("");
-                this.tfKlartext.setText("");
-                this.lblSpruchschluessel.setText("");
-                this.resetDisplay = false;
-                this.codierer.resetHardware();
-                textCodiert = "";
-                textEingabe = "";
-                // Spruchschlüssel generieren und codieren
-                this.codierer.generateSpruchschluessel();
-                // Spruchschluessel in das Feld lblSpruchschluessel schreiben
-                lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
-            }
-            textEingabe += pressedButton.getText();
-            chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
-            textCodiert += chiffrierterBuchstabe;
-
-            tfKlartext.setText(textEingabe);
-            tfCodiert.setText(textCodiert);
-
-            // Position der Walzen aktuallisieren
-            mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
-            mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
-            mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
-        } else {
-            new Fehler().showErrorDialog("error", "Du Labertasche!", "250 Zeichen sind " +
-                    "selbst für die Wehrmacht zu viel!");
-        }
-    }
-
-    /**
-     * Konvertiert eine rämische Zahl in eine arabische Zahl
-     *
-     * @param nummer : String : Römische Zahl
-     * @return int : arabische Zahl
-     */
-    private int convertRoemischToZahl(String nummer) {
-        int result = 0;
-
-        switch (nummer) {
-            case "I":
-                result = 0;
-                break;
-            case "II":
-                result = 1;
-                break;
-            case "III":
-                result = 2;
-                break;
-            case "IV":
-                result = 3;
-                break;
-            case "V":
-                result = 4;
-                break;
-            default:
-                break;
-        }
-        return result;
-    }
-
-    /**
-     * Konvertiert eine arabische Zahl in eine rämische Zahl
-     *
-     * @param nummer : int : arabische Zahl
-     * @return String : römische Zahl
-     */
-    private String convertZahlToRoemisch(int nummer) {
-        String result = "";
-
-        switch (nummer) {
-            case 0:
-                result = "I";
-                break;
-            case 1:
-                result = "II";
-                break;
-            case 2:
-                result = "III";
-                break;
-            case 3:
-                result = "IV";
-                break;
-            case 4:
-                result = "V";
-                break;
-            default:
-                break;
-        }
-        return result;
-    }
-
-    /**
-     * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
-     * ->d.h. welche Walze sitzt auf welcher Position
-     *
-     * @param walzeRoemischNr => gibt die Walzennummer an
-     * @param walzenPosition  => gibt die Position der Walze
-     */
-    private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
-        switch (walzenPosition) {
-            case 1:
-                mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-                break;
-            case 2:
-                mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-                break;
-            case 3:
-                mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
-     * -> d.h. welche Walze sitzt auf welcher Position
-     *
-     * @param walzenPosition => gibt die Position der Walze
-     * @param walzeNr        => gibt die Walzennummer an
-     */
-    private void setzeWalze(int walzenPosition, int walzeNr) {
-        switch (walzenPosition) {
-            case 1:
-                mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
-                break;
-            case 2:
-                mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
-                break;
-            case 3:
-                mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
-     * Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
-     * um eine Stelle versetzt
-     *
-     * @param ringStellung   => gibt die walze an
-     * @param walzenPosition => gibt den notch der Walze (walze) an
-     */
-    private void setzeRing(int walzenPosition, int ringStellung) {
-        switch (walzenPosition) {
-            case 1:
-                mBtnNotchPos1.setText(ringNr[ringStellung]);
-                break;
-            case 2:
-                mBtnNotchPos2.setText(ringNr[ringStellung]);
-                break;
-            case 3:
-                mBtnNotchPos3.setText(ringNr[ringStellung]);
-                break;
-            default:
-                break;
-        }
-    }
-
-    /**
-     * Setzt die Startposition/ aktuelle Position der Walze
-     *
-     * @param walze     => gibt die walze an
-     * @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
-     */
-    private void setzePosition(int walze, char buchstabe) {
-        switch (walze) {
-            case 1:
-                mBtnStartPos1.setText(String.valueOf(buchstabe));
-                break;
-            case 2:
-                mBtnStartPos2.setText(buchstabe + "");
-                break;
-            case 3:
-                mBtnStartPos3.setText(buchstabe + "");
-                break;
-            default:
-                break;
         }
-    }
-
-    /**
-     * Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
-     */
-    private void setzeTagesSchluessel() {
-
-        // Umsprungpunkte anzeigen
-        mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
-        mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
-        mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
-
-        // Walzennummern anzeigen
-        setzeWalze(1, codierer.fetchWalzenNr()[0]);
-        setzeWalze(2, codierer.fetchWalzenNr()[1]);
-        setzeWalze(3, codierer.fetchWalzenNr()[2]);
-
-        // Position der Walzen anzeigen
-        mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
-        mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
-        mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
-
-        // Steckbrett Felder setzen
-        myToggleButtons();
-
-        // Felder zurück setzen
-        this.textCodiert = "";
-        this.textEingabe = "";
-        this.tfKlartext.setText("");
-        this.tfCodiert.setText("");
-    }
-
-    /**
-     * Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
-     *
-     * @param kenngruppe : String : aktuelle Kenngruppe
-     */
-    void setKenngruppe(String kenngruppe) {
-
-        // Initialisieren des Codierers und setzen der Kenngruppe
-        codierer = new Codierer(kenngruppe.toUpperCase());
-
-        this.codierer.resetHardware();
-
-        // Setzt die Kenngruppe in der GUI
-        lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
-
-        // Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
-        resetDisplay = true;
-
-        // Einstellungen aus dem Logbuch auslesen und setzen
-        setzeTagesSchluessel();
-    }
-
-    private enum BUCHSTABE_LEUCHTET {AN, AUS}
-    //endregion
+	}
+
+	/**
+	 * Auswertung welcher Button (senden, empfangen oder löschen) gedrückt wurde.
+	 * Funktionsaufruf entsprechend des gedrückten Button
+	 *
+	 * @param e => ActionEvent des auslösenden Button
+	 */
+	@FXML
+	private void gedrueckteTaste(ActionEvent e) {
+		if (e.getSource() == btnSenden) {
+			if (tfCodiert.getText().equals("")) {
+				new Fehler().showErrorDialog("warning", "Haben Sie heute nichts zu sagen?",
+						"Nutzung von militärischer Infrastruktur ohne Grund ist verboten.");
+			} else {
+				sendeFunkspruch();
+			}
+		}
+		if (e.getSource() == btnEmpfangen) empfangeFunkspruch();
+		if (e.getSource() == btnDelete) loeschen();
+		if (e.getSource() == btnReset) {
+			codierer.resetHardware();
+			this.resetDisplay = true;
+			this.lblSpruchschluessel.setText("");
+			this.setzeTagesSchluessel();
+		}
+	}
+
+	/**
+	 * Setzt die Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb bzw. auf grau.
+	 *
+	 * @param leuchte       => gibt an welcher Kreis (chiffrierter Buchstabe) den Hintergrund ändern soll
+	 * @param shiningLetter => "AN"  -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf gelb
+	 *                      "AUS" -> setzt Hintergrundfarbe des Kreises (chiffrierter Buchstabe) auf grau
+	 */
+	private void leuchten(Circle leuchte, BUCHSTABE_LEUCHTET shiningLetter) {
+		if (shiningLetter == BUCHSTABE_LEUCHTET.AN) leuchte.setStyle("-fx-fill: #FFA500");
+		else if (shiningLetter == BUCHSTABE_LEUCHTET.AUS) {
+			leuchte.setStyle("-fx-background-color: grey");
+			leuchte.setStyle("-fx-border-color:  #000000");
+		}
+	}
+	//endregion
+
+	//region Methoden
+
+	/**
+	 * Gibt den Buchstabenkreis entsprechend des chiffrierten Buchstabens zurück
+	 *
+	 * @param chiffLetter => chiffrierter Buchstabe
+	 * @return => Kreis des chiffrierten Buchstabens (der leuchten soll)
+	 */
+	private Circle chiffCircle(char chiffLetter) {
+		switch (chiffLetter) {
+			case 'A':
+				return circA;
+			case 'B':
+				return circB;
+			case 'C':
+				return circC;
+			case 'D':
+				return circD;
+			case 'E':
+				return circE;
+			case 'F':
+				return circF;
+			case 'G':
+				return circG;
+			case 'H':
+				return circH;
+			case 'I':
+				return circI;
+			case 'J':
+				return circJ;
+			case 'K':
+				return circK;
+			case 'L':
+				return circL;
+			case 'M':
+				return circM;
+			case 'N':
+				return circN;
+			case 'O':
+				return circO;
+			case 'P':
+				return circP;
+			case 'Q':
+				return circQ;
+			case 'R':
+				return circR;
+			case 'S':
+				return circS;
+			case 'T':
+				return circT;
+			case 'U':
+				return circU;
+			case 'V':
+				return circV;
+			case 'W':
+				return circW;
+			case 'X':
+				return circX;
+			case 'Y':
+				return circY;
+			case 'Z':
+				return circZ;
+		}
+		return null;
+	}
+
+	/**
+	 * Methode zum setzen des menuButton Textes auf das ausgewählte MenuItem
+	 *
+	 * @param mBtn : MenuButton der Walze
+	 * @param mItm : MenuItem
+	 */
+	private void setMenuBtnText(MenuButton mBtn, MenuItem mItm) {
+		if (mBtn.getId().equals(mBtnStartPos1.getId())) {
+			setzePosition(1, mItm.getText().charAt(0));
+			this.codierer.setzeWalzenPosition(0, mItm.getText().charAt(0));
+		}
+		if (mBtn.getId().equals(mBtnStartPos2.getId())) {
+			setzePosition(2, mItm.getText().charAt(0));
+			this.codierer.setzeWalzenPosition(1, mItm.getText().charAt(0));
+		}
+		if (mBtn.getId().equals(mBtnStartPos3.getId())) {
+			setzePosition(3, mItm.getText().charAt(0));
+			this.codierer.setzeWalzenPosition(2, mItm.getText().charAt(0));
+		}
+		if (mBtn.getId().equals(mBtnWalzPos1.getId())) {
+			setzeWalze(1, mItm.getText());
+			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
+					!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText())) {
+				this.codierer.setzeWalzeNr(0,
+						convertRoemischToZahl(mItm.getText()) + 1,
+						mBtnNotchPos1.getText().charAt(0));
+			} else {
+				setzeWalze(1, convertZahlToRoemisch(this.codierer.fetchWalzenNr(0)));
+				new Fehler().showErrorDialog("error",
+						"Walze nicht gefunden",
+						"Es scheint so das wir von jeder Walze nur eine da haben");
+			}
+		}
+		if (mBtn.getId().equals(mBtnWalzPos2.getId())) {
+			setzeWalze(2, mItm.getText());
+			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos2.getText()) &&
+					!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
+				this.codierer.setzeWalzeNr(1,
+						convertRoemischToZahl(mItm.getText()) + 1,
+						mBtnNotchPos2.getText().charAt(0));
+			} else {
+				setzeWalze(2, convertZahlToRoemisch(this.codierer.fetchWalzenNr(1)));
+				new Fehler().showErrorDialog("error",
+						"Walze nicht gefunden",
+						"Es scheint so das wir von jeder Walze nur eine da haben");
+			}
+		}
+		if (mBtn.getId().equals(mBtnWalzPos3.getId())) {
+			setzeWalze(3, mItm.getText());
+			if (!mBtnWalzPos1.getText().equals(mBtnWalzPos3.getText()) &&
+					!mBtnWalzPos2.getText().equals(mBtnWalzPos3.getText())) {
+				this.codierer.setzeWalzeNr(2,
+						convertRoemischToZahl(mItm.getText()) + 1,
+						mBtnNotchPos3.getText().charAt(0));
+			} else {
+				setzeWalze(3, convertZahlToRoemisch(this.codierer.fetchWalzenNr(2)));
+				new Fehler().showErrorDialog("error",
+						"Walze nicht gefunden",
+						"Es scheint so das wir von jeder Walze nur eine da haben");
+			}
+		}
+		if (mBtn.getId().equals(mBtnNotchPos1.getId())) {
+			setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
+			this.codierer.setzeRing(0, Integer.parseInt(mItm.getText()) - 1);
+		}
+		if (mBtn.getId().equals(mBtnNotchPos2.getId())) {
+			setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
+			this.codierer.setzeRing(1, Integer.parseInt(mItm.getText()) - 1);
+		}
+		if (mBtn.getId().equals(mBtnNotchPos3.getId())) {
+			setzeRing(3, Integer.parseInt(mItm.getText()) - 1);
+			this.codierer.setzeRing(2, Integer.parseInt(mItm.getText()) - 1);
+		}
+		tfCodiert.setText("");
+		tfKlartext.setText("");
+	}
+
+	/**
+	 * Die Löschen Funktion löscht das letzte Zeichen im Klartext sowie im Codiert Feld,
+	 * der Codierer wird aufgerufen um ebenfalls das letzte Zeichen zu löschen
+	 */
+	private void loeschen() {
+		if (textEingabe.length() == 0) {
+			tfKlartext.setText("");
+			tfCodiert.setText("");
+		} else {
+			textEingabe = textEingabe.substring(0, textEingabe.length() - 1);
+			textCodiert = textCodiert.substring(0, textCodiert.length() - 1);
+			tfKlartext.setText(textEingabe);
+			tfCodiert.setText(textCodiert);
+			codierer.letztesZeichenLoeschen();
+			mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
+			mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
+			mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
+		}
+	}
+
+	/**
+	 * Holt Nachricht von Klasse Codierer und setzt den chiffrierten Text in das Textfeld tfCodiert,
+	 * sowie den Klartext in das Textfeld tfKlartext. Setzt den Spruchschlüssel
+	 */
+	private void empfangeFunkspruch() {
+		progressDialogue("rx");
+
+		try {
+			if (this.empfangeneNachricht[2] != null && this.empfangeneNachricht[1] != null) {
+				setzeTagesSchluessel();
+				tfKlartext.setText(this.empfangeneNachricht[2]);
+				tfCodiert.setText(this.empfangeneNachricht[1]);
+				resetDisplay = true;
+
+				// Spruchschluessel in das Feld lblSpruchschluessel schreiben
+				lblSpruchschluessel.setText(codierer.empfangenerSpruchschluessel(this.empfangeneNachricht[2]));
+			}
+		} catch (NullPointerException ignored) {
+			new Fehler().showErrorDialog(
+					"warning",
+					"Keiner schreibt dir...",
+					"Es liegen keine neuen Nachrichten im Funkraum für Sie vor.");
+		}
+	}
+
+	/**
+	 * Senden der Nachricht mit Hilfe der Klasse Codierer
+	 * Löscht die Textfelder tfKlartext und tfCodiert
+	 */
+	private void sendeFunkspruch() {
+		this.tfKlartext.setText("");
+		this.tfCodiert.setText("");
+
+		progressDialogue("tx");
+	}
+
+	/**
+	 * Methode die das ProgressDialog Fenster erstellt und verwaltet
+	 *
+	 * @param strRxTx : String : RX => empfangen
+	 *                TX => senden
+	 */
+	private void progressDialogue(String strRxTx) {
+		Task copyWorker = createWorker(strRxTx);
+
+		ProgressIndicator pi = new ProgressIndicator();
+		pi.setProgress(-1);
+
+		ProgressDialog dialog = new ProgressDialog(copyWorker);
+		dialog.initStyle(StageStyle.TRANSPARENT);
+		dialog.setTitle("Kommunikation zum Funkraum");
+		if (strRxTx.equals("rx")) {
+			dialog.setContentText("Empfange Nachricht");
+		} else if (strRxTx.equals("tx")) {
+			dialog.setContentText("Sende Nachricht");
+		}
+		dialog.setHeaderText(null);
+		dialog.setGraphic(pi);
+		dialog.initStyle(StageStyle.UTILITY);
+		new Thread(copyWorker).start();
+		dialog.showAndWait();
+	}
+
+	/**
+	 * Thread Worker für Nachricht senden / empfangen
+	 *
+	 * @param strRxTx : String : RX => empfangen
+	 *                TX => senden
+	 * @return boolean
+	 */
+	private Task createWorker(String strRxTx) {
+		return new Task() {
+			@Override
+			protected Object call() {
+				if (strRxTx.equals("rx")) {
+					empfangeneNachricht = codierer.empfangeNachricht();
+				} else if (strRxTx.equals("tx")) {
+					try {
+						codierer.sendeNachricht();
+					} catch (IOException e) {
+						e.printStackTrace();
+					}
+				}
+
+				return true;
+			}
+		};
+	}
+
+	/**
+	 * Schreibt Buchstaben des gedrückten Button in Textfeld tfKlartext.
+	 * Übergabe des Buchstaben vom gedrückten Button an die Klasse Codierer
+	 * Ablegen des chiffrierten Buchstaben in der char Variable chiffrierterBuchstabe
+	 * Hinzufügen des chiffrierten Buchstaben in Textfeld tfCodiert
+	 * Aktualisierung der Walzenstellung
+	 *
+	 * @param pressedButton : gedrückter Knopf
+	 */
+	private boolean setText(Button pressedButton) {
+		if (textEingabe.length() < 250) {
+			if (this.resetDisplay) {
+				this.tfCodiert.setText("");
+				this.tfKlartext.setText("");
+				this.lblSpruchschluessel.setText("");
+				this.resetDisplay = false;
+				this.codierer.resetHardware();
+				textCodiert = "";
+				textEingabe = "";
+				// Spruchschlüssel generieren und codieren
+				this.codierer.generateSpruchschluessel();
+				// Spruchschluessel in das Feld lblSpruchschluessel schreiben
+				lblSpruchschluessel.setText(this.codierer.getSpruchschluessel());
+			}
+			textEingabe += pressedButton.getText();
+			chiffrierterBuchstabe = codierer.codiere(pressedButton.getText().charAt(0), true);
+			textCodiert += chiffrierterBuchstabe;
+
+			tfKlartext.setText(textEingabe);
+			tfKlartext.appendText("");
+			tfCodiert.setText(textCodiert);
+            tfKlartext.appendText("");
+
+			// Position der Walzen aktuallisieren
+			mBtnStartPos1.setText(String.valueOf(this.codierer.fetchWalzen()[0]));
+			mBtnStartPos2.setText(String.valueOf(this.codierer.fetchWalzen()[1]));
+			mBtnStartPos3.setText(String.valueOf(this.codierer.fetchWalzen()[2]));
+
+			return true;
+		} else {
+			new Fehler().showErrorDialog("error", "Wir wussten das du das testen wirst", "250 Zeichen sind " +
+					"selbst für die Wehrmacht zu viel!");
+			return false;
+		}
+	}
+
+	/**
+	 * Konvertiert eine rämische Zahl in eine arabische Zahl
+	 *
+	 * @param nummer : String : Römische Zahl
+	 * @return int : arabische Zahl
+	 */
+	private int convertRoemischToZahl(String nummer) {
+		int result = 0;
+
+		switch (nummer) {
+			case "I":
+				result = 0;
+				break;
+			case "II":
+				result = 1;
+				break;
+			case "III":
+				result = 2;
+				break;
+			case "IV":
+				result = 3;
+				break;
+			case "V":
+				result = 4;
+				break;
+			default:
+				break;
+		}
+		return result;
+	}
+
+	/**
+	 * Konvertiert eine arabische Zahl in eine rämische Zahl
+	 *
+	 * @param nummer : int : arabische Zahl
+	 * @return String : römische Zahl
+	 */
+	private String convertZahlToRoemisch(int nummer) {
+		String result = "";
+
+		switch (nummer) {
+			case 0:
+				result = "I";
+				break;
+			case 1:
+				result = "II";
+				break;
+			case 2:
+				result = "III";
+				break;
+			case 3:
+				result = "IV";
+				break;
+			case 4:
+				result = "V";
+				break;
+			default:
+				break;
+		}
+		return result;
+	}
+
+	/**
+	 * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
+	 * ->d.h. welche Walze sitzt auf welcher Position
+	 *
+	 * @param walzeRoemischNr => gibt die Walzennummer an
+	 * @param walzenPosition  => gibt die Position der Walze
+	 */
+	private void setzeWalze(int walzenPosition, String walzeRoemischNr) {
+		switch (walzenPosition) {
+			case 1:
+				mBtnWalzPos1.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+				break;
+			case 2:
+				mBtnWalzPos2.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+				break;
+			case 3:
+				mBtnWalzPos3.setText(walzenNr[convertRoemischToZahl(walzeRoemischNr)]);
+				break;
+			default:
+				break;
+		}
+	}
+
+	/**
+	 * Setzt die Anzeige des entsprechende Gui-Element auf die entsprechende Walze
+	 * -> d.h. welche Walze sitzt auf welcher Position
+	 *
+	 * @param walzenPosition => gibt die Position der Walze
+	 * @param walzeNr        => gibt die Walzennummer an
+	 */
+	private void setzeWalze(int walzenPosition, int walzeNr) {
+		switch (walzenPosition) {
+			case 1:
+				mBtnWalzPos1.setText(walzenNr[walzeNr - 1]);
+				break;
+			case 2:
+				mBtnWalzPos2.setText(walzenNr[walzeNr - 1]);
+				break;
+			case 3:
+				mBtnWalzPos3.setText(walzenNr[walzeNr - 1]);
+				break;
+			default:
+				break;
+		}
+	}
+
+	/**
+	 * Setzt den Notch (position)=> die Mitnahmeposition der Walze (walze) fest
+	 * Mitnahmeposition meint => die nächste Walze wird bei erreichen dieser Position (notch)
+	 * um eine Stelle versetzt
+	 *
+	 * @param ringStellung   => gibt die walze an
+	 * @param walzenPosition => gibt den notch der Walze (walze) an
+	 */
+	private void setzeRing(int walzenPosition, int ringStellung) {
+		switch (walzenPosition) {
+			case 1:
+				mBtnNotchPos1.setText(ringNr[ringStellung]);
+				break;
+			case 2:
+				mBtnNotchPos2.setText(ringNr[ringStellung]);
+				break;
+			case 3:
+				mBtnNotchPos3.setText(ringNr[ringStellung]);
+				break;
+			default:
+				break;
+		}
+	}
+
+	/**
+	 * Setzt die Startposition/ aktuelle Position der Walze
+	 *
+	 * @param walze     => gibt die walze an
+	 * @param buchstabe gibt den Startwert bzw die aktuelle Position der Walze (walze) an
+	 */
+	private void setzePosition(int walze, char buchstabe) {
+		switch (walze) {
+			case 1:
+				mBtnStartPos1.setText(String.valueOf(buchstabe));
+				break;
+			case 2:
+				mBtnStartPos2.setText(buchstabe + "");
+				break;
+			case 3:
+				mBtnStartPos3.setText(buchstabe + "");
+				break;
+			default:
+				break;
+		}
+	}
+
+	/**
+	 * Setzt den aktuellen TagesSchluessel und zeigt diesen in der GUI an
+	 */
+	private void setzeTagesSchluessel() {
+
+		// Umsprungpunkte anzeigen
+		mBtnNotchPos1.setText(String.valueOf(codierer.fetchRingstellung()[0]));
+		mBtnNotchPos2.setText(String.valueOf(codierer.fetchRingstellung()[1]));
+		mBtnNotchPos3.setText(String.valueOf(codierer.fetchRingstellung()[2]));
+
+		// Walzennummern anzeigen
+		setzeWalze(1, codierer.fetchWalzenNr()[0]);
+		setzeWalze(2, codierer.fetchWalzenNr()[1]);
+		setzeWalze(3, codierer.fetchWalzenNr()[2]);
+
+		// Position der Walzen anzeigen
+		mBtnStartPos1.setText(String.valueOf(codierer.fetchWalzen()[0]));
+		mBtnStartPos2.setText(String.valueOf(codierer.fetchWalzen()[1]));
+		mBtnStartPos3.setText(String.valueOf(codierer.fetchWalzen()[2]));
+
+		// Steckbrett Felder setzen
+		myToggleButtons();
+
+		// Felder zurück setzen
+		this.textCodiert = "";
+		this.textEingabe = "";
+		this.tfKlartext.setText("");
+		this.tfCodiert.setText("");
+	}
+
+	/**
+	 * Lädt die Daten aus dem Codebuch und setzt die Kenngruppe in der Gui
+	 *
+	 * @param kenngruppe : String : aktuelle Kenngruppe
+	 */
+	void setKenngruppe(String kenngruppe) {
+
+		// Initialisieren des Codierers und setzen der Kenngruppe
+		codierer = new Codierer(kenngruppe.toUpperCase());
+
+		this.codierer.resetHardware();
+
+		// Setzt die Kenngruppe in der GUI
+		lblKenngruppe.setText("Kenngruppe: " + this.codierer.getKenngruppe());
+
+		// Beim nächsten Tastendruck erstmal das Display löschen damit falschen Nachrichten geschickt werden.
+		resetDisplay = true;
+
+		// Einstellungen aus dem Logbuch auslesen und setzen
+		setzeTagesSchluessel();
+	}
+
+	private enum BUCHSTABE_LEUCHTET {AN, AUS}
+	//endregion
 }
-- 
GitLab