Commit 00aabc0c authored by Flori N's avatar Flori N
parents 71eac38c fb3cf17c
Pipeline #399 passed with stages
in 1 minute and 25 seconds
......@@ -24,4 +24,82 @@
![alt text](Folie13.PNG "Präsentation Folie 13")
![alt text](Folie14.PNG "Präsentation Folie 14")
\ No newline at end of file
![alt text](Folie14.PNG "Präsentation Folie 14")
## Der Begin einer Reise
* [Anforderungskatalog und Planung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/wikis/Anforderungskatalog)
## Ablauf des Projektes
* Wie wurde gearbeitet
* gitrepo.de
* Git
* Tickets
* Pipelines
* Welche Probleme sind aufgetreten
* Besondere (für uns) Lösungen
### Kurze GIT Einführnug
* Was ist Git?
* Repository
* Fork
* Funktionen
* Commit
* Push
* Pull
### Zahlen, Daten, Fakten
* Zeilen insgesamt: 3113
* Davon Code: 1596 (51%)
* Davon Kommentare: 1120 (36%)
* Leerzeilen: 397 (13%)
## Klassendiagram
![Ablaufdiagram Enigma](http://plantuml.gitrepo.de/png/U9oTM4jpspOGlkjNuDPsLEhGeoRJIMCdxKoir6DvcawJZ0SYLn8Y4601q4wTnh-z2v82IJmerJv8z7wB3yjzOQ6Nsb1bwfBFPeOP3kJkRlNxvUkhxpIvu5HhSideJj7oxkwZcCq84RG4NT4SIANaPpYO1GYsAodvYk0GBcK1l9CIaZTSuoMBHcLnWP-REjyxNVkN4SN4JXlWl1OxiYHCc0-VHWe8veTxK1icYbOdtrFruPEdPcYtV2HzeFmH1ASxY73FoT6cxtyOYRTWylqjBj8wt_CQlu1xAZimDmFBGtGzDZjKGFvG-DxPws56herrrKZyH7J8arbXqhO6dRAjKOYOyMrsLeWPA51UY0yWn4xLLMM3qBx621SqtokMxqqSrfN24FMHE4-hjILAsSIzCTHpSjwApv92MMsfsC6xe_49N81QUwR5icqYcHhS2nc8c58RjZJopd_XnZngu8I5c9XlNGn3BEK2MmNJn1pCem7z5-1g45SIjFtsb902jj0uOAF0c6kf_9qKODB-HbNnG8D0DLZAH0sYI8PGJxmsOezmunTa9-zjZQ5DB9A05wEC511Bm84yqXWo5zctijfw41FCCCgPjekZJiEkJ4KXorSsTePk_byNU5EBWw9rEUe2JwuWBDmMQz3BC1OHz9mzZw_XTPws_MCFQ5phDVz4liJBlL2mXsXzsPC0jXnDac5vcMGgk6OVIzSeejCRwOcD9kWUuLfgJ0OPnLBP7VIISmAqaahRXFKZP4KhMc68RXNOfnTjEl_OjUsVH_ixbY1c0dkZSVbwAqzeElXMXadUMeO1ce12_dEyuE8tyaAOS-TmzG7tN8hMqHeRgG5dluYVcLAn7HEKJ-lDIJAtuhNIPCaVwEN6ZF10EuNNi07LTlsXrY23p_5FawQUQoYlzlYQYK736qNjc3aUCMibT7B8T9pUOFhGbKkmS4vY9y7a3F9JiYk5tILTscbaOWfnRIGueFe1On2V_hE_AXGKSungcBuj7BKMbtXyYGqLX_NVd1dmIWRVC3gzsvOY1EGcQanqnr-gQa3-5Il1iFoRdIbpF4LjNErtg30d9ML3BwANx2rh876wpQX-8sKKp0YNj7Zpv-ggGoUC_RLc5r8O9JaV3TfTMJMtbdLitZfn0Z-vkM2KJBQT55YA-S4WD-R62EDGspuZni9mZCj82Q8U2LAdVNS3MQ7-AoDkuOlnePWiUf9bqNCi6yneYO4w2mUrYOZqCs8qC4ZsmEnzKbuhLbBrpsd65QPLB2D72MVNDtsmfNWF6mtgdkNGBapVKER4de30k8SqP35BNloRrLL6FjDxklsoe5N5MKwjhstb79_3jRQikgKHrb0_wiSu0LA7wyUL4LyOsoDaycwpCWjul9yqbj6V34BYP6yxPuj1ntk-oMvGNf9zzvWYSwf9idwSMPAa6q_J32QP9T6RvnErH_woEt9FPSYKpriluWpmV4-xQn0cH_UO8dEgIR9-V5wICcbKhsM9-evWNUB-cSrUOkkrlmJ-1wA6sF40 "Ablaufdiagram der Enigma")
## Interesannte Codestellen
* Walze:
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Walze.java#L53)
* Steckbrett
* [setzeVertauschung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Steckbrett.java#L52)
* [ueberpruefeVertauschung](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Steckbrett.java#L104)
* Codebuch
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Codebuch.java#L59)
* [fetchTagesschluessel](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Codebuch.java#L81)
* Funkraum
* [empfangeFunkspruch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Funkraum.java#L38)
* [sendeFunkspruch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Funkraum.java#L90)
* Morsecode
* [Konstruktor](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/model/Morsecode.java#L18)
* [convertBuchstabeToMorsecode](`convertBuchstabeToMorsecode`)
* DatenbankSqlite
* [getCodebuch](https://www.gitrepo.de/alfatrainingkurse/java/enigma/blob/master/src/main/java/projekt/enigma/database/DatenbankSqlite.java#L54)
* Zusammenfassung codiere
* [Codiere Funktion](https://www.gitrepo.de/alfatrainingkurse/java/enigma/snippets/12)
### Ablauf der Codierung
![Ablaufdiagram Codierung](http://plantuml.gitrepo.de/png/U9o5aR4EWZ0GXlS-HHCNwA01Drmm3kegCGx6eT0J21NCSOJ4frTeD35feTCbttVNQ_-u9OdKFJGR2nO9iMjK2GWy8IphN8WDwujI0_T-28LOPgRqZENxZFF8AcI5H7zby46YwYM23I-su_ct54815wbVK7lV8Gb1LgK8H8vRZ2_4DRXDyt26h-ty17SD5JMkLrhwmxa574BW4AR-06h5nyJOaER-VEJRhirb2aEKBJLF5d-K8V8tFTUTQm00 "Ablaufdiagram Codierung")
### Erklärung Datentyp char - String - Enum
* Zuerst char[]
* Dann String
* Vorteile Enum
## Die GUI der Enigma (Elemente, etc)
* Besondere GUI Elemente
* ControlsFX (ProgressDialog)
## GUI Controller
## Demo der Enigma
* Kenngruppe Abfrage
* Testen Kenngruppe Dialog und Fehler
* Enigma
* Setzen von Walzen
* Setzen von Ringen
* Setzen von Startpunkten
* Zurücksetzen
* Tagesschlüssel
* Verschlüsseln von Nachrichten
* Senden von Nachrichten
* Abrufen und entschlüsseln von Nachrichten
* Setzen einer anderen Kenngruppe und zeigen was passiert wenn man dann Nachrichten abrufen möchte
......@@ -2,10 +2,9 @@ package projekt.enigma;
import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextField;
import javafx.scene.control.*;
import javafx.scene.input.KeyCode;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
......@@ -20,86 +19,80 @@ import java.io.IOException;
*/
public class App extends Application {
private static String kenngruppe;
private static GuiController gc;
private static int debug;
public static void main(String[] args) {
debug = 1;
launch(args);
}
public static int getDebug() {
return debug;
}
@Override
public void start(Stage primaryStage) throws IOException {
primaryStage.setTitle("Kenngruppenabfrage");
Label label1 = new Label("Bitte Kenngruppe eingeben!");
label1.setTranslateX(55);
Label l1 = new Label("");
Label l2 = new Label("");
TextField tfield = new TextField();
Button button1 = new Button("Kenngruppe setzen!");
VBox layout1 = new VBox();
layout1.getChildren().addAll(label1, l1, tfield, l2, button1);
Scene sceKenngruppe = new Scene(layout1, 234, 137);
FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml"));
Scene sceApp = new Scene(guiLoader.load(), 962, 677);
tfield.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
if (enter(tfield.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfield.getText());
primaryStage.setScene(sceApp);
} else {
tfield.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z.");
}
}
});
button1.setOnAction(e -> {
if (enter(tfield.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfield.getText());
primaryStage.setScene(sceApp);
} else {
tfield.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z.");
}
});
primaryStage.setScene(sceKenngruppe);
primaryStage.show();
}
private boolean enter(String kenngruppe) {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
boolean result = true;
for (char c : kenngruppe.toUpperCase().toCharArray()) {
if (!alphabet.contains(String.valueOf(c))) {
result = false;
break;
}
}
if (kenngruppe.length() > 8 || kenngruppe.length() < 4) {
result = false;
}
return result;
}
private static GuiController gc;
private static int debug;
public static void main(String[] args) {
debug = 1;
launch(args);
}
public static int getDebug() {
return debug;
}
@Override
public void start(Stage primaryStage) throws IOException {
primaryStage.setTitle("Enigma");
Label lblEingbae = new Label("Bitte Kenngruppe eingeben!");
TextField tfEingabe = new TextField();
Button btnKenngruppe = new Button("Kenngruppe setzen!");
VBox layout = new VBox();
layout.setSpacing(30);
layout.setPadding(new Insets(30, 30, 30, 30));
btnKenngruppe.setMaxWidth(Double.MAX_VALUE);
layout.getChildren().addAll(lblEingbae, tfEingabe, btnKenngruppe);
Scene sceKenngruppe = new Scene(layout);
FXMLLoader guiLoader = new FXMLLoader(App.class.getResource("gui.fxml"));
Scene sceApp = new Scene(guiLoader.load(), 962, 677);
tfEingabe.setOnKeyPressed(e -> {
if (e.getCode() == KeyCode.ENTER) {
if (enter(tfEingabe.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfEingabe.getText());
primaryStage.setScene(sceApp);
} else {
tfEingabe.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie nur Buchstaben von A-Z.");
}
}
});
btnKenngruppe.setOnAction(e -> {
if (enter(tfEingabe.getText())) {
gc = guiLoader.getController();
gc.setKenngruppe(tfEingabe.getText());
primaryStage.setScene(sceApp);
} else {
tfEingabe.setText("");
new Fehler().showErrorDialog("error", "Kenngruppe falsch",
"Regeln für die Kenngruppe: 4-8 Zeichen sowie Buchstaben von A-Z.");
}
});
primaryStage.setScene(sceKenngruppe);
primaryStage.show();
}
private boolean enter(String kenngruppe) {
String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
boolean result = true;
for (char c : kenngruppe.toUpperCase().toCharArray()) {
if (!alphabet.contains(String.valueOf(c))) {
result = false;
break;
}
}
if (kenngruppe.length() > 8 || kenngruppe.length() < 4) {
result = false;
}
return result;
}
// /**
// * TODO Dokumentieren
......
......@@ -12,6 +12,7 @@ import javafx.scene.control.MenuItem;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.GridPane;
import javafx.scene.layout.Pane;
import javafx.scene.shape.Circle;
import javafx.stage.StageStyle;
import org.apache.http.HttpException;
......@@ -37,10 +38,8 @@ public class GuiController {
private Codierer codierer;
private char chiffrierterBuchstabe;
private String[] empfangeneNachricht;
//deklariert die benötigten Textfelder
@FXML
private TextField tfStecker1, tfStecker2, tfStecker3, tfStecker4, tfStecker5, tfStecker6, tfStecker7, tfStecker8,
tfStecker9, tfStecker10, tfCodiert, tfKlartext;
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//endregion
//region GUI-Elemente
......@@ -48,7 +47,7 @@ public class GuiController {
//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;
btnR, btnS, btnT, btnU, btnV, btnW, btnX, btnY, btnZ, btnSenden, btnEmpfangen, btnDelete, btnReset, btnPort0;
//deklariert die benötigten Kreise
@FXML
private Circle circA, circB, circC, circD, circE, circF, circG, circH, circI, circJ, circK, circL, circM, circN,
......@@ -65,11 +64,18 @@ public class GuiController {
@FXML
private MenuButton mBtnWalzPos1, mBtnWalzPos2, mBtnWalzPos3, mBtnNotchPos1, mBtnNotchPos2, mBtnNotchPos3,
mBtnStartPos1, mBtnStartPos2, mBtnStartPos3;
//deklariert die benötigten Textfelder
@FXML
private TextField tfStecker1, tfStecker2, tfStecker3, tfStecker4, tfStecker5, tfStecker6, tfStecker7, tfStecker8,
tfStecker9, tfStecker10, tfCodiert, tfKlartext;
//deklariert benötigte panes
@FXML
private Pane port0, port1, port2, port3, port4, port5, port6, port7, port8, port9;
//deklariert benötigtes GridPane
@FXML
private GridPane mainGrid;
private static final String alphabet = "ABCDEFGHIJKLMNOPQRSTUVWXYZ";
//endregion
......@@ -102,24 +108,24 @@ public class GuiController {
menu(mBtnStartPos2, position);
}
/**
/* *//**
* Für das Steckbrett müssen zehn CheckComboBoxen erstellt werden.
* Hier wird die Funktion zum erstellen und Befüllen der Boxen, die Funktion zehn mal aufgerufen.
*/
*//*
private void generateSteckbrett() {
for (int i = 0; i <= 9; i++) {
this.createSteckbrettPort(i);
}
}
}*/
/**
/* *//**
* Die Funktion createSteckbrettPort erstellt zehn CheckComboBoxen, holt sich die verfügbaren Buchstaben,
* die bereits gesteckten Kabel und weißt sie zu.
* Im Anschluss werden die CheckComboBoxen auf dem GridPane positioniert.
*
* @param port : int : Kabel Nummer (0-9)
*/
*//*
private void createSteckbrettPort(int port) {
// Item Liste anlegen
......@@ -133,10 +139,10 @@ public class GuiController {
StringBuilder sb = new StringBuilder();
/**
*//**
* Die Buchstaben in die CheckComboBox laden und zusätzlich in einen String um später den
* Index des Buchstaben auslesen zu können
*/
*//*
for (char c : verfuegbareBuchstaben) {
items.add(c);
sb.append(c);
......@@ -151,7 +157,7 @@ public class GuiController {
// Die Gesteckten Buchstaben in der CheckComboBox selektieren
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][0]));
ccb.getCheckModel().check(sb.toString().indexOf(this.codierer.fetchSteckverbindungen()[port][1]));
}
}*/
/**
* init Methode zur Erstellung der Einträge und Action Listener für die einzelnen Menüs
......@@ -352,6 +358,9 @@ public class GuiController {
this.resetDisplay = true;
this.setzeTagesSchluessel();
}
if (e.getSource()==btnPort0){
//TODO pane0 anzeigen
}
}
//endregion
......@@ -631,7 +640,7 @@ public class GuiController {
walzeNr = 2;
break;
case "IV":
walzeNr = 4;
walzeNr = 3;
break;
case "V":
walzeNr = 4;
......@@ -769,9 +778,8 @@ public class GuiController {
// Steckbrett Felder setzen
// Setzt das Steckbrett
generateSteckbrett();
//generateSteckbrett();
/*
tfStecker1.setText(codierer.fetchSteckverbindungen()[0][0] + "" +
codierer.fetchSteckverbindungen()[0][1]);
tfStecker2.setText(codierer.fetchSteckverbindungen()[1][0] + "" +
......@@ -791,7 +799,7 @@ public class GuiController {
tfStecker9.setText(codierer.fetchSteckverbindungen()[8][0] + "" +
codierer.fetchSteckverbindungen()[8][1]);
tfStecker10.setText(codierer.fetchSteckverbindungen()[9][0] + "" +
codierer.fetchSteckverbindungen()[9][1]);*/
codierer.fetchSteckverbindungen()[9][1]);
this.textCodiert = "";
this.textEingabe = "";
this.tfKlartext.setText("");
......
......@@ -25,18 +25,17 @@ public class Codebuch {
//region Variablen
/**
* TODO: Dokumentieren tag
* tag : int : gibt den Tag an
* tag : int : gibt den Tag eines Monats an
*/
private int tag;
/**
* walzenlage : int[] : legt die Positionen der Walzen fest
* walzenlage : int[] : legt die Positionen der drei Walzen fest
*/
private int[] walzenlage;
/**
* ringstellung : int[] : TODO ringstellung: char || int ?
* ringstellung : int[] : legt die Ringstellungen der drei Walzen fest
*/
private int[] ringstellung;
......
......@@ -46,7 +46,9 @@ public class Codierer {
*/
private Codebuch codebuch;
//TODO Dokumentieren
/**
* Thread mit der Abfolge an Aufgaben des Funkraums.
*/
private Thread funk;
//endregion
......@@ -344,10 +346,10 @@ public class Codierer {
}
/**
* TODO: Doku
* Ueberprueft welche Buchstaben noch zur Vertauschung verfügbar sind
*
* @param port
* @return
* @param port: Zahl zwischen 0-9: entspricht der Kabelnummer.
* @return String: liefert einen String mit den verfuegbaren Buchstaben zurueck.
*/
public String fetchVerfuegbareBuchstaben(int port) {
return this.hardware.getSteckbrett().fetchVerfuegbareBuchstaben(port);
......
......@@ -17,10 +17,18 @@ public class Hardware {
//region Variablen
/**
* TODO: Dokumentieren
* walzen: Walze-Array: erzeugt ein privates Array mit der die Anzahl der Walzen festgelegt wird.
*/
private Walze[] walzen;
/**
* steckbrett: Steckbrett: erzeugt ein privates Steckbrett-Objekt
*/
private Steckbrett steckbrett;
/**
* reflektor: Reflektor: erzeugt ein privates Reflektor-Objekt.
*/
private Reflektor reflektor;
//endregion
......
package projekt.enigma.view;
import java.awt.*;
import javax.swing.*;
public class ChkBoxPanel extends JPanel {
/*private static JPanel panel = new JPanel();*/
private static JCheckBox[] checkbox;
private static Character[] alphabet;/* = {'A','B','C','D'};*/
private static int charSize;
public ChkBoxPanel(Character[] alphabet) {
this.charSize = alphabet.length;
this.alphabet = alphabet;
/*this.setTitle("Vertausche Buchstaben");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);*/
this.setSize(30, charSize * 25);
//this.setLocation(getMousePosition()/*.x, getMousePosition().y+this.getHeight()+30*/);
initializeComponents();
}
private void initializeComponents() {
this.checkbox = new JCheckBox[charSize];
GridLayout panelLayout = new GridLayout();
this.setLayout(panelLayout);
if (!(charSize % 2 == 0)) {
this.setSize(30, (charSize + 1) * 20);
panelLayout.setRows((charSize + 1) / 2);
} else {
this.setSize(30, charSize * 10);
panelLayout.setRows(charSize / 2);
}
panelLayout.setColumns(2);
//panelLayout.setVgap(5);
//panelLayout.setHgap(-5);
for (int i = 0; i < charSize; i++) {
checkbox[i] = new JCheckBox(alphabet[i] + "");
checkbox[i].setSize(15, 20);
checkbox[i].setHorizontalTextPosition(SwingConstants.CENTER);
checkbox[i].setVerticalTextPosition(SwingConstants.TOP);
/* if (!(i%2==0)){
}*/
checkbox[i].setMargin(new Insets(0, 20, 0, 20));
//checkbox[i].setLocation(20, (i + 1) * 30);
this.add(checkbox[i]);
}
/* this.getContentPane().add(panel);*/
checkbox[0].setSelected(true);
//this.add(panel);
//this.setLocation(100, 100);
this.setVisible(true);
}
private int isChecked() {
for (int i = 0; i < charSize; i++) {
if (checkbox[i].isSelected()) {
// do something...
} else {
// do something else...
}
}
return 0;
}
}
......@@ -13,9 +13,8 @@
<?import javafx.scene.shape.Circle?>
<?import javafx.scene.text.Font?>
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/8.0.999-ea" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<AnchorPane maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="677.0" prefWidth="962.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="projekt.enigma.GuiController">
<children>
<AnchorPane layoutX="207.0" layoutY="-111.0" prefHeight="111.0" prefWidth="487.0" AnchorPane.leftAnchor="207.0" AnchorPane.rightAnchor="274.0" />
<GridPane layoutX="23.0" layoutY="60.0" prefHeight="158.0" prefWidth="237.0" AnchorPane.leftAnchor="23.0" AnchorPane.topAnchor="60.0">
<columnConstraints>
<ColumnConstraints hgrow="SOMETIMES" minWidth="10.0" prefWidth="100.0" />
......@@ -670,7 +669,56 @@
<Insets left="42.0" />
</GridPane.margin>
</Label>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="7" />
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="1" GridPane.rowIndex="7">
<children>
<Pane fx:id="port0" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="2" GridPane.rowIndex="7">
<children>
<Pane fx:id="port1" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="3" GridPane.rowIndex="7">
<children>
<Pane fx:id="port2" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="4" GridPane.rowIndex="7">
<children>
<Pane fx:id="port3" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="5" GridPane.rowIndex="7">
<children>
<Pane fx:id="port4" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="6" GridPane.rowIndex="7">
<children>
<Pane fx:id="port5" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="7" GridPane.rowIndex="7">
<children>
<Pane fx:id="port6" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="8" GridPane.rowIndex="7">
<children>
<Pane fx:id="port7" disable="true" layoutY="-304.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="9" GridPane.rowIndex="7">
<children>
<Pane fx:id="port8" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
<Pane prefHeight="200.0" prefWidth="200.0" GridPane.columnIndex="10" GridPane.rowIndex="7">
<children>
<Pane fx:id="port9" disable="true" layoutX="-3.0" layoutY="-303.0" prefHeight="346.0" prefWidth="86.0" visible="false" />
</children>
</Pane>
</children>
</GridPane>
<Label layoutX="684.0" layoutY="-164.0" prefHeight="17.0" prefWidth="195.0"