# List -Tableview-Javafx-Vererbung



## MudiTrue (23. Jul 2018)

Hi, bin neu hier hatte gesehen, dass hier einige sehr gute Lösungen vorgeschlagen wurden, da dachte ich, ich versuch mal mein Glück.

Habe folgendes Problem:
VerwaltungsApp (Benutzeroberfläche) mit Javafx Tableview man kann Benutzer hinzufügen.
Die benutzer werden beim start aus einer .dat datei geladen , in der eine Serialized object list steckt.

habe 4 Klassen was die Verwaltung der Personen angeht:

Person ( int Typ,alter ; String vorname,nachname)
Student extends Person (int matrikelnummer ; String Studiengang)
Studentischehilfskraft extends Student (int arbeitsstunden ; String arbeitsort)
Angestellter extends Person (int arbeitsstunden ; String arbeitsort)

Das erste Problem: 

```
//Vornameame column
        TableColumn<Person, String> typColumn = new TableColumn<>("Typ");
        typColumn.setMinWidth(200);
        typColumn.setCellValueFactory(new PropertyValueFactory<>("typ"));
```


Wenn ich jetzt statt TableColumn<Person, String>  eher TableColumn<Student, String> 
eingebe weil ich die matrikelnummer populaten möchte taucht ein fehler auf und in person habe ich ja die matrikelnummer nicht drin....
________________________________________________________________________


Mein 2. Problem:





```
public ObservableList<Person> getPerson(){
        ObservableList<Person> person= FXCollections.observableArrayList();
        int i = indexOfList;

        String vorname=null;
        int arbeitsort= list.indexOf(2);
        String studiengang =null;
        String nachname = null;
        int alter=0;
        int freietage=0;
        int arbeitsstunden=0;
        int matrikelnummer=0;
        int typo=0;




        for(Person b :list){
           System.out.println(i +":  "+  b.toString());
           
           person.add(new Person(b.getVorName(), b.getNachName(), b.getTyp(), b.getAlter(), b.getTage()));
            person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),1, b.getAlter(), b.getTage(),"matrikelnummer","sss",i,"ss"));


            i++;
        };
        return person ;
    }
```


Aus der liste kann ich ja ganz leicht die informationen rausziehen die ich möchte, alerdings wieder nur bedingt, da ich die Liste in der Klasse Person angelegt habe, die anderen Klassen erben diese zwar auch, und wenn ich list.toString(); ausgeben lasse funktioniert alles einwandfrei und sogar matrikelnummer und studiengang werden ausgegeben,
aber mit der Tableview funktioniert das halt nicht und ich kann die matrikelnummer nicht aus der liste ziehen hängt ja mit problem nummer 1 zusammen.... :/
und ich möchte ungern alle daten in der Klasse Person initialisieren/deklarieren.

Hier der ganze code von der Main methode.

der Code gibt alles 2 mal wieder einmal Oberfläche und einmal in der Console.
Consolenprogramm funktioniert super nur die GUI nicht


Was kann ich jetzt denn tun? Seitze seit 11 Stunden ohne einen fortschritt dran. habe sovieles schon ausgetestet


Danke schonmal!!!!!!

```
public class Main extends Application {
    static Scanner scanner = new Scanner(System.in);
    Button button;
    TextField nameInput,vornameInput, alterInput, freieTageInput, arbeitsOrtInput, arbeitsStundenInput, matrikelNummerInput, studiengangInput;
    Stage window;
    TableView<Person> table;
    int indexOfList;
    ChoiceBox<String> typAuswahl;

    public static void main(String[] args) {
        launch(args);

        System.out.println("                                *  Hauptmenue  *");
        System.out.println("                                ________________");
        System.out.println("");
        System.out.println("Waehlen Sie eines der beiden Ausfuehrungarten aus:");
        System.out.println("    ------------------------------------------------------------------------");
        System.out.println("   (1)  GUI");
        System.out.println("   (2)  Console ");
        System.out.println("Geben Sie eine Zahl ein:");
        checkint();
        int w12 = scanner.nextInt();
        switch (w12) {
            case 1:
                launch(args);
                break;
            case 2:
                Hauptmenu();
                break;



            default:    System.out.println("Ungueltige Eingabe; versuchen Sie es erneut:");
                Hauptmenu();
                break;
        }
    }

    public static void Hauptmenu() {
        System.out.println(" ");
        System.out.println(" ");
        System.out.println("                                ________________");
        System.out.println(" ");
        System.out.println("                                *  Hauptmenue  *");
        System.out.println("                                ________________");
        System.out.println("");
        System.out.println("Waehlen Sie eines der beiden Dateiformate aus:");
        System.out.println("    ------------------------------------------------------------------------");
        System.out.println("   (1)  .CSV");
        System.out.println("   (2)  .DAT");
        System.out.println("Geben Sie eine Zahl ein:");
        checkint();
        int w1 = scanner.nextInt();
        switch (w1) {
            case 1: System.out.println(" ");
                System.out.println(" ");
                System.out.println("                                ________________");
                System.out.println(" ");
                System.out.println("                                *  Hauptmenue .CSV *");
                System.out.println("                                ________________");
                System.out.println("");
                System.out.println("Sie koennen hier Personen der Hochschule fuer Technik und Wirtschaft verwalten:");
                System.out.println("    ------------------------------------------------------------------------");
                System.out.println("   (1)  Anlegen");
                System.out.println("   (2)  Suchen nach Arrayposition");
                System.out.println("   (3)  Filtern");
                System.out.println("   (4)  Nach Typ ausgeben");
                System.out.println("   (5)  Alle zeigen");
                System.out.println("   (6)  CSV anzeigen");
                System.out.println("   (7)  GUI- oberfläche");
                System.out.println("   (6)  Programm beenden");
                System.out.println("");
                System.out.println("Geben Sie eine Zahl ein:");
                checkint();
                int w2 = scanner.nextInt();
                switch (w2) {
                    case 1: add();
                        break;
                    case 2: Read();
                        break;

                    case 3: ReadFilter();
                        break;
                    case 4:ReadAll();
                        break;
                    case 5:ReadAll(2);
                        break;
                    case 6:CSVReadALL();
                        break;
                    case 7:
                        break;


                    default:    System.out.println("Ungueltige Eingabe; versuchen Sie es erneut:");
                        Hauptmenu();
                        break;
                }
                break;
            case 2:  System.out.println(" ");
                System.out.println(" ");
                System.out.println("                                ________________");
                System.out.println(" ");
                System.out.println("                                *  Hauptmenue  *");
                System.out.println("                                ________________");
                System.out.println("");
                System.out.println("Sie koennen hier Personen der Hochschule fuer Technik und Wirtschaft verwalten:");
                System.out.println("    ------------------------------------------------------------------------");
                System.out.println("   (1)  Anlegen");
                System.out.println("   (2)  Suchen nach Arrayposition");
                System.out.println("   (3)  Filtern");
                System.out.println("   (4)  Nach Typ ausgeben");
                System.out.println("   (5)  Alle zeigen");
                System.out.println("");
                System.out.println("   (6)  Programm beenden");
                System.out.println("");
                System.out.println("Geben Sie eine Zahl ein:");
                checkint();
                int w3 = scanner.nextInt();
                switch (w3) {
                    case 1: add();
                        break;
                    case 2: Read();
                        break;

                    case 3: ReadFilter();
                        break;
                    case 4:ReadAll();
                        break;
                    case 5:ReadAll(2);
                        break;
                    case 6:CSVReadALL();
                        break;
                    default:    System.out.println("Ungueltige Eingabe; versuchen Sie es erneut:");
                        Hauptmenu();
                        break;
                }
                break;




            default:    System.out.println("Ungueltige Eingabe; versuchen Sie es erneut:");
                Hauptmenu();
                break;
        }




    }

    private static void CSVReadALL() {
        String fileName= "personTest.csv";
        File file = new File(fileName);
        try{
            Scanner inputSream = new Scanner(file);
            while(inputSream.hasNext()){
                String data = inputSream.next();
                System.out.println(data);
            }
            inputSream.close();
        } catch (FileNotFoundException e) {
            e.printStackTrace();
        }
    }
    private static void CSVOutput() {

    }

    private static void add() {
      
      
         System.out.println("Vorname : ");
         String vorname  = scanner.next();

         System.out.println("Nachname : ");
         String nachname  = scanner.next();

         System.out.println("Alter : ");
         checkint();
         int alter =    checkintR(18,65,true);
       
         System.out.println("Freie Wochentage : ");
         checkint();
         int freieTage =    checkintR(1,6,true);

      
      
        System.out.println("Waehlen Sie den Typ der Person aus;");
      
        System.out.println("1 fuer Angestellte ; 2 fuer Student ; 3 fuer studentische Mitarbeiter :   ");
    
        int typ =  checkintR(1,3,false);
      
        switch(typ) {
        case 1:      

             System.out.println("ArbeitsOrt: ");
             String ort  = scanner.next();

      

             System.out.println("Arbeitsstunden pro Woche : ");
             checkint();
             int stunden =    checkintR(1,40,true);
           
             Person.add(new Angestellte(  vorname, nachname,  typ, alter , freieTage, stunden, ort ));
            // Angestellte.add(new Angestellte(vorname, nachname,  typ, alter , freieTage, stunden, ort));
             break;
        case 2:      
             System.out.println("Matrikelnummer : ");
             checkint();
             int matrikel=  checkintR(11111,66666,true);
           
             System.out.println("Studiengang : ");
             String studiengang  = scanner.next();
  
           
             Person.add(new Student( vorname, nachname,  typ, alter , freieTage, matrikel, studiengang ));
        //     Student.add(new Student( vorname, nachname,  typ, alter , freieTage, matrikel, studiengang));
      
            break;
        case 3:      
             System.out.println("Matrikelnummer : ");
             checkint();
             int matrikel1=  checkintR(11111,66666,true);
           
             System.out.println("Studiengang : ");
             String studiengang1  = scanner.next();
  
             System.out.println("ArbeitsOrt: ");
             String ort1  = scanner.next();

             System.out.println("Arbeitsstunden pro Woche : ");
             checkint();
             int stunden1 =    checkintR(1,40,true);

           
             Person.add(new StudentischeHilfskraft(  vorname, nachname,  typ, alter , freieTage, matrikel1,studiengang1, stunden1, ort1 ));
            // StudentischeHilfskraft.add(new StudentischeHilfskraft( vorname, nachname,  typ, alter , freieTage, matrikel1,studiengang1, stunden1, ort1));
      
            break;
      
    
        }


        System.out.println("");
        Hauptmenu();
    }

    public static void Read() {
        System.out.println("Index : ");
        if(Person.getAnzahl() == 0){
            System.out.println("keine Personen eingetragen");
            Hauptmenu();
        }else{
        int index = checkintR(1,Person.getAnzahl(),false);
        Person.read(index-1);

        System.out.println("");
        Hauptmenu();
    }}

    public static void ReadAll(int a ) {
      
        Person.readAll();


        System.out.println("");
        Hauptmenu();
    }

    public static void ReadFilter( ) {

        try {
            Person.readAll();
        } catch (Exception e) {
            e.printStackTrace();
        }


        System.out.println("");
        Hauptmenu();
    }
  
    public static void ReadAll() {
      
       // Person.readAll();
        Student.readAll(2);
        StudentischeHilfskraft.readAll(2);
        Angestellte.readAll(2);

        System.out.println("");
        Hauptmenu();
    }

    public static int checkintR(int start,int end,boolean alter) {
        checkint();
        int value = scanner.nextInt();

        while (value < start || value > end){
            if (alter) {
                System.out.println("Bitte geben Sie eine Zahl zwischen "+start+" und "+end+" ein");
            }else{
                System.out.println("Bitte geben Sie eine Zahl zwischen "+start+" und "+end+" ein");
            }
            return checkintR(start,end,alter);
        }
           return value;
    }

  
    public static void checkint() {
        while (!scanner.hasNextInt()) {
            System.out.println("Bitte geben Sie nur Zahlen ein: ");
            scanner.next();
        }
    }

    @Override
    public void start(Stage primaryStage) throws Exception {
        window = primaryStage;
        window.setTitle("Verwaltung!");





        //TypAuswahl
         typAuswahl = new ChoiceBox<>();
        typAuswahl.getItems().addAll("Typ Auswahl","Student","Studentische Hilfskraft","Angestellter");
        typAuswahl.setValue("Typ Auswahl");


        //Vornameame column
        TableColumn<Person, String> typColumn = new TableColumn<>("Typ");
        typColumn.setMinWidth(200);
        typColumn.setCellValueFactory(new PropertyValueFactory<>("typ"));

        //Vornameame column
        TableColumn<Person, String> vornameColumn = new TableColumn<>("Vorname");
        vornameColumn.setMinWidth(200);
        vornameColumn.setCellValueFactory(new PropertyValueFactory<>("VorName"));

        //Name column
        TableColumn<Person, String> nachnameColumn = new TableColumn<>("Nachname");
        nachnameColumn.setMinWidth(200);
        nachnameColumn.setCellValueFactory(new PropertyValueFactory<>("NachName"));



        //Alter column
        TableColumn<Person, Integer> alterColumn = new TableColumn<>("Alter");
        alterColumn.setMinWidth(100);
        alterColumn.setCellValueFactory(new PropertyValueFactory<>("alter"));

        //freieTage column
        TableColumn<Person, Integer> tageColumn = new TableColumn<>("Freie Tage");
        tageColumn.setMinWidth(100);
        tageColumn.setCellValueFactory(new PropertyValueFactory<>("tage"));

        //arbeitsOrtColumn
        TableColumn<Person, Integer> arbeitsOrtColumn = new TableColumn<>("Arbeitsort");
        arbeitsOrtColumn.setMinWidth(100);
        arbeitsOrtColumn.setCellValueFactory(new PropertyValueFactory<>("Arbeitsort"));

        //arbeitsstundenColumn column
        TableColumn<Person, Integer> arbeitsstundenColumn = new TableColumn<>("Arbeitsstunden");
        arbeitsstundenColumn.setMinWidth(100);
        arbeitsstundenColumn.setCellValueFactory(new PropertyValueFactory<>("Arbeitsstunden"));

        //IDColumn column
        TableColumn<Person, Integer> IDColumn = new TableColumn<>("ID");
        IDColumn.setMinWidth(100);
        IDColumn.setCellValueFactory(new PropertyValueFactory<>("Arbeitsstunden"));


        //matrikelnummerColumn column
        TableColumn<Person, Integer> matrikelnummerColumn = new TableColumn<>("Matrikelnummer");
        matrikelnummerColumn.setMinWidth(100);
        matrikelnummerColumn.setCellValueFactory(new PropertyValueFactory<>("matrikelnummer"));

        //arbeitsstundenColumn column
        TableColumn<Person, String> studiengangColumn = new TableColumn<>("Studiengang");
        studiengangColumn.setMinWidth(100);
        studiengangColumn.setCellValueFactory(new PropertyValueFactory<>("studiengang"));


        //Name input
        vornameInput = new TextField();
        vornameInput.setPromptText("Vorname ");
        vornameInput.setMinWidth(100);

        //Name input

        nameInput = new TextField();
        nameInput.setPromptText("Nachname ");
        nameInput.setMinWidth(100);


        //alter input

        alterInput = new TextField();
       alterInput.setPromptText("Alter");

        //freie Tage input
        freieTageInput = new TextField();
        freieTageInput.setPromptText("Freie Tage");


        //arbeitsort input
        arbeitsOrtInput = new TextField();
        arbeitsOrtInput.setPromptText("Arbeitsort");
        //freie Tage input
        arbeitsStundenInput= new TextField();
        arbeitsStundenInput.setPromptText("arbeitsStundenInput");
        //matrikelNummerInput
        matrikelNummerInput = new TextField();
        matrikelNummerInput.setPromptText("matrikelNummerInput");
        //studiengangInput
        studiengangInput = new TextField();
        studiengangInput.setPromptText("studiengangInput");


        //Button
        Button addButton = new Button("Hinzufuegen");
        addButton.setOnAction(e -> addButtonClicked() );

        Button deleteButton = new Button("Loeschen");
        deleteButton.setOnAction(e -> deleteButtonClicked());

        HBox hBox = new HBox();
        hBox.setPadding(new Insets(10,10,10,10));
        hBox.setSpacing(10);
        hBox.getChildren().addAll(typAuswahl,vornameInput,nameInput, alterInput, freieTageInput,arbeitsOrtInput,arbeitsStundenInput,matrikelNummerInput,studiengangInput, addButton, deleteButton);


        table = new TableView<>();
        table.setItems(getPerson());
        table.setItems(getPerson());
        table.getColumns().addAll(typColumn,vornameColumn, nachnameColumn, alterColumn, tageColumn, arbeitsOrtColumn, arbeitsstundenColumn, studiengangColumn, matrikelnummerColumn);

        VBox vBox = new VBox();
        vBox.getChildren().addAll(table, hBox);

        Scene scene = new Scene(vBox);
        window.setScene(scene);
        window.show();

    }



   // private static List<Person> list = (List)Person.loadE("personTest.dat" );//laden aus Datei

    private static List<Person> list = (List)Person.loadE("personTest.dat" );//laden aus Datei


    public ObservableList<Person> getPerson(){
        ObservableList<Person> person= FXCollections.observableArrayList();
        int i = indexOfList;

        String vorname=null;
        int arbeitsort= list.indexOf(2);
        String studiengang =null;
        String nachname = null;
        int alter=0;
        int freietage=0;
        int arbeitsstunden=0;
        int matrikelnummer=0;
        int typo=0;

//        StudentischeHilfskraft studentischeHilfskraft = new StudentischeHilfskraft(vorname,nachname,typo,alter,freietage,matrikelnummer,studiengang,arbeitsstunden,"dd");



        for(Person b :list){
           // System.out.println(i +":  "+  b.toString());
            System.out.println(i +":  "+StudentischeHilfskraft.getArbeitsstunden()+" List"+ StudentischeHilfskraft.getList().get(i).toString());
            person.add(new Person(b.getVorName(), b.getNachName(), b.getTyp(), b.getAlter(), b.getTage()));
            person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),1, b.getAlter(), b.getTage(),b.toString().indexOf("matrikelnummer"),"sss",i,"ss"));
          //  person.add(new Person(b.getVorName(), b.getNachName(), b.getTyp(), b.getAlter(), b.getTage(),b.getMatrikel(),b.getArbeitsstunden(), b.getArbeitsort());

            i++;
        };

/*
        ObservableList<StudentischeHilfskraft> personStu= FXCollections.observableArrayList();
        for(Person b3 :list){
            System.out.println(i +":  "+  b3.toString());
            System.out.println(i +":  "+  b3.toString());
            person.add(new StudentischeHilfskraft(b3.getVorName(), b3.getNachName(),1, b3.getAlter(), b3.getTage(),b3.toString().indexOf("matrikelnummer"),"sss",i,"ss"));
          //  System.out.println(studentischeHilfskraft.getArbeitsort());

            i++;
        }; */

        return person ;
    }


    //Add button clicked
    public void addButtonClicked(){

        /* Person person = new Person( vorname, nameInput.getText(),  1,Integer.parseInt(priceInput.getText()) , 2);
        person.setVorname(nameInput.getText());
        person.setNachName(nameInput.getText());
        person.setAlter((int) Double.parseDouble(priceInput.getText()));
        person.setTage(Integer.parseInt(quantityInput.getText())); */
        //System.out.println(nameInput.getText());

        if(typAuswahl.getValue()=="Student"){
            if(validateAlter(alterInput.getText())&&validatefreieTage(freieTageInput.getText())){
                System.out.println(nameInput.getText() + " Vorname:"+vornameInput.getText()+" Alter;"+Integer.parseInt(alterInput.getText()));
                int typ=2;
                int freieTage=2;
                int stunden=2;
                String ort="BerlinCity";

                Person.add(new Angestellte(vornameInput.getText(),nameInput.getText(),typ,Integer.parseInt(alterInput.getText()),freieTage, stunden, ort ));
                Angestellte.add(new Angestellte(vornameInput.getText(), nameInput.getText(),  typ, Integer.parseInt(alterInput.getText()) ,stunden , stunden, ort));

                //     table.getItems().add(Person.get);

                //table.getItems().add(person);
                nameInput.clear();
                alterInput.clear();
                freieTageInput.clear();
            }
            else{
                System.out.println("Fehler");
            }

        }
        else {
            System.out.println(typAuswahl.getValue());
        }


    }


    //Delete button clicked
    public void deleteButtonClicked(){
        ObservableList<Person> productSelected, allPersons;
        allPersons = table.getItems();
        productSelected = table.getSelectionModel().getSelectedItems();

        productSelected.forEach(allPersons::remove);
    }




    //__________________________________VAlidation

    private boolean validateAlter(String text){
        Pattern p = Pattern.compile("[0-9]+");

        Matcher m = p.matcher(text);
        if(m.find() && m.group().equals(text)){

            if( (Integer.parseInt(text) >=18)&& (Integer.parseInt(text) <=110)){
                return true;
            }

            else{
                Alert alert = new Alert(Alert.AlertType.WARNING);
                alert.setTitle("Validierung vom Alter fehlgeschlagen");
                alert.setContentText("Validierung vom Alter fehlgeschlage; Geben sie ein Alter zwischen 18 und 110 Jahren ein " +
                      text+  " Passt nicht in den Intervall");
                alert.showAndWait();
                return false;
            }
        }
        else{
            Alert alert = new Alert(Alert.AlertType.WARNING);
            alert.setTitle("Validierung vom Alter fehlgeschlagen");
            alert.setContentText("Validierung vom Alter fehlgeschlage; Geben sie ein Alter zwischen 18 und 110 Jahren ein " +
                    text +"Passt nicht in den Intervall");
            alert.showAndWait();
            return false;
        }
    }


    //__________________________________VAlidation

    private boolean validatefreieTage(String text){
        Pattern p = Pattern.compile("[0-9]+");
        Matcher m = p.matcher(text);
        if(m.find() && m.group().equals(text)){

            if( (Integer.parseInt(text) >=0)&& (Integer.parseInt(text) <=6)){
                return true;
            }

            else{
                Alert alert = new Alert(Alert.AlertType.WARNING);
                alert.setTitle("ValidateNumbverrr");
                alert.setContentText("Sie können Maximal 6 freie Tage in der Woche habe und Minimal 0 " +
                        " Somit stimmt "+text+" nicht überein");
                alert.showAndWait();
                return false;
            }
        }
        else{
            Alert alert = new Alert(Alert.AlertType.WARNING);
            alert.setTitle("ValidateNumbverrr");
            alert.setContentText("Bitte eine Zahl eingeben "+text+" ist keine Zahl");
            alert.showAndWait();
            return false;
        }
    }



}
```


----------



## Xyz1 (23. Jul 2018)

MudiTrue hat gesagt.:


> habe sovieles schon ausgetestet


Wir schreiben hier Dir doch keine fertige Uni-Verwaltung.... Das kannst Du schön selbst machen.... und auf die Tränendrüse drücken gibts bei mir nicht.



MudiTrue hat gesagt.:


> populaten möchte taucht ein fehler auf und in person habe ich ja die matrikelnummer nicht drin....


das ist verständlich, weil der Typ der Liste `Person` ist.
Überlege Dir auf wie viele Arte das zu umgehen ist.
Am Besten wäre noch eine erweiterbare/ausklappbare Liste und eine Fallunterscheidung vorzunehmen....



MudiTrue hat gesagt.:


> Mein 2. Problem:


Das ist similar zum ersten Problem....

Noch Fragen?


----------



## MudiTrue (23. Jul 2018)

DerWissende hat gesagt.:


> Wir schreiben hier Dir doch keine fertige Uni-Verwaltung.... Das kannst Du schön selbst machen.... und auf die Tränendrüse drücken gibts bei mir nicht.


Danke für deine unverschämte Antwort. Ich habe lediglich nur auf einige Tips gehofft. Wer hat was vom Schreiben erwähnt? Es ist doch schon fertig, nur die TableView spackt..... 


DerWissende hat gesagt.:


> das ist verständlich, weil der Typ der Liste Person ist.
> Überlege Dir auf wie viele Arte das zu umgehen ist.
> Am Besten wäre noch eine erweiterbare/ausklappbare Liste und eine Fallunterscheidung vorzunehmen....



Klar das weis ich ja, allerdings wusste ich nicht, wie ich es sonst machen sollte... erweiterbare Liste? inwiefern?


----------



## Xyz1 (23. Jul 2018)

Eine erweiterbare Liste meinte ich so was:

```
A         B         C         
aaa.......-.........-.........
aa........b.........-.........
a.........bb........ccc.......
aa........b.........cc........
aaaa......-.........-.........
```

verständlich?


----------



## MudiTrue (23. Jul 2018)

danke dir für die Hilfe.

klar verständlich, aber ich hab es doch genauso.. 

```
Name                 Matrikel        Studiengang       4.Coloum
DerWissende.-. 333333-.        Informatik         auchIn Liste
MudiTrue .... .    33332.-.        Sport                  erscheint aber
a.........                  bb.......         .ccc.......              nicht
aa.......                 .b.........          cc........
aaaa.....                .-........           .-.........
```




Ich glaube ich hatte mein problem schlecht erklärt oder? jetzt bin ich noch verwirrter.... 

die ersten 4 columns kann ich sehen, die restlichen aber nicht, da sind irgendwelche defaultwerte die ich einfach eingegeben habe, laden aber nicht von der .dat

Ich habe halt nur eine liste <Person> und da sind 8 items enthalten Name                 Matrikel        Studiengang       4.Coloum  nummer Handy  etc

in der Console mache ich das selbe, da lädt aber alles ganz normal von der einen List und alle coloumns erscheinen , meinst du etwas ich soll 2 verschiedene Tables erstellen?


----------



## mihe7 (23. Jul 2018)

Meinst Du so etwas in der Richtung?


```
matrikelnummerColumn.setCellValueFactory(data -> new ReadOnlyObjectWraper<String>(
    (data.getValue() instanceof StudentischeHilfskraft)
        ? ((StudentischeHilfskraft) data.getValue()).getMatrikel()
        : ""));
```


----------



## MudiTrue (23. Jul 2018)

mihe7 hat gesagt.:


> Meinst Du so etwas in der Richtung?
> 
> 
> ```
> ...


VIELEN DANK!!!!!

das löst zwar nicht mein Problem  aber dank dir nen Stück viel weiter.

mein Problem liegt in der ObservableList<Person> getPerson() methode


```
person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),b.getTyp(), b.getAlter(), b.getTage(),    0 , " LEER ",000,"ArbeitsOrt"));
```

--->> 0 , " LEER ",000,"ArbeitsOrt"
Die 4 sind zwar in meiner list aber bekomm die nicht einzeln ausgebeben.
bei einem b.toString() funkt die ganze ausgabe, deshalb dachte ich mir ich benutzt mal nen string.split() aber der wird überlastet... und crashed irgendwann wenn ich einen part rausnehmen möchte. 

```
String string = list.get(i).toString();
            String parts[] = string.split(":");
            for(int g =0; g<parts.length;g++){
                System.out.println("------>" +parts[g]);
```

wenn ich es doch schaffen sollte den string zu splitten, dann würde es easy gehen.
zb. part[4]=matrikelnummer; und die Tabelle würde dies ausgeben


----------



## mihe7 (24. Jul 2018)

Mach doch einfach

```
public ObservableList<Person> getPerson(){
        return FXCollections.observableArrayList(list);
}
```


----------



## MudiTrue (24. Jul 2018)

mihe7 hat gesagt.:


> Mach doch einfach
> 
> ```
> public ObservableList<Person> getPerson(){
> ...


omg .... danke hahah 
ich bin gerade fertig geworden mit meiner Lösung und dann kommt einfach nur ein returnwert haha dankeeee

ich zeig dir mal was ich gemacht habe  



```
public ObservableList<Person> getPerson(){
        ObservableList<Person> person= FXCollections.observableArrayList();
        int i = indexOfList;




        for(Person b :list){
            // System.out.println(i +":  "+  b.toString());

if(b.getTyp()==1){


    System.out.println("Das sind die Splittungen"  +" | ______________________________________________________ab hier tyname : "+b.getTypName());
    String string = list.get(i).toString();
    String parts[] = string.split(":");
    for(int g =0; g<parts.length;g++){
        System.out.println("------>" +parts[g]);
    }

    System.out.println("------<<<<<<<<<<<<<<<<<<<<<<>" +parts[5]);

    System.out.println("Das STring :: " +b.toString() +"    TYP!" +b.getTyp());
      System.out.println("Das sind ddd    " +Integer.parseInt(parts[13]));

    //  person.add(new Person(b.getVorName(), b.getNachName(), b.getTyp(), b.getAlter(), b.getTage()));
    person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),b.getTyp(), b.getAlter(), b.getTage(), 0, null,Integer.parseInt(parts[13]),parts[11]));

    i++;
}

           else if(b.getTyp()==2){


    System.out.println("Das sind die Splittungen"  +" | ab hier Studen Typname : "+b.getTypName());

    // SPlit beginnt vom string
    String string = list.get(i).toString();
    String parts[] = string.split(":");
    for(int g =0; g<parts.length;g++){
        System.out.println("------>" +parts[g]);
    }

    System.out.println("------<<<<<<<<<<<<<<<<<<<<<<>" +parts[5]);

    System.out.println("Das STring :: " +b.toString() +"    TYP!" +b.getTyp());
    //   System.out.println("Das sind ddd    " +b.toString());

    //  person.add(new Person(b.getVorName(), b.getNachName(), b.getTyp(), b.getAlter(), b.getTage()));
    person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),b.getTyp(), b.getAlter(), b.getTage(),Integer.parseInt(parts[3]), parts[13],0,null));

    i++;

            }



                //Studentische Mitarbeiter

           else if(b.getTyp()==3){
    System.out.println("Das sind die Splittungen"  +" | ab hier tyname : "+b.getTypName());




    String string = list.get(i).toString();
    String parts[] = string.split(":");
    for(int g =0; g<parts.length;g++){
        System.out.println("------>" +parts[g]);
    }

   // System.out.println("------<<<<<<<<<<<<<<<<<<<<<<  5 Stelle !" +parts[5]);



    person.add(new StudentischeHilfskraft(b.getVorName(), b.getNachName(),b.getTyp(), b.getAlter(), b.getTage(),Integer.parseInt(parts[3]), parts[13],Integer.parseInt(parts[17]),parts[15]));

    i++;
            }

        }



        return person ;
 
    }
```




ich sitze so lange dran nur wegen einer zeile? hahahah ich kriege meine macken , danke nochmal!!!!!


----------



## Xyz1 (24. Jul 2018)

@MudiTrue Habe das Problem nachgeblättert.... Java ist invariant. Mach das doch einfach so:

 

Person, Student und SMitarbeiter können nach einer Zeile gefragt werden....
und wenn Student oder Person zum Beispiel keine Matrikelnummer anbieten dann wird "" (String ohne Inhalt) oder `null` von TRow für TCol zurück-gegeben.
ListOfPerson hält einfach eine Liste mit Personen....


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> Mach das doch einfach so:
> 
> Anhang anzeigen 11058
> 
> Person, Student und SMitarbeiter können nach einer Zeile gefragt werden....


Mach das bitte nicht so.


----------



## MudiTrue (24. Jul 2018)

DerWissende hat gesagt.:


> @MudiTrue Habe das Problem nachgeblättert.... Java ist invariant. Mach das doch einfach so:
> 
> Anhang anzeigen 11058
> 
> ...


Danke dir sehr!
hat jetzt alles geklappt

Danke euch beiden für eure Mühen!  !!!!!!!
 endlich fertig
Auf zum nächsten Abenteuer


----------



## Xyz1 (24. Jul 2018)

mrBrown hat gesagt.:


> Mach das bitte nicht so.


Misch Dich hier nicht ein, es geht um professionelle Softwareentwicklung....

Oder liefere wenigstens ein Gegenargument


----------



## mihe7 (24. Jul 2018)

MudiTrue hat gesagt.:


> ich sitze so lange dran nur wegen einer zeile? hahahah ich kriege meine macken , danke nochmal!!!!!


So kann man auch mit kleinen Sachen, @MudiTrue eine Freude machen...


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> Oder liefere wenigstens ein Gegenargument


Die Darstellung hat in der Domänenklasse nichts zu suchen.


----------



## mihe7 (24. Jul 2018)

DerWissende hat gesagt.:


> es geht um professionelle Softwareentwicklung....



Das wage ich in Anbetracht der Eingangsfrage zu bezweifeln


----------



## Xyz1 (24. Jul 2018)

mihe7 hat gesagt.:


> Das wage ich in Anbetracht der Eingangsfrage zu bezweifeln


Ich finde es schon eine schöngestellte Frage.... du nicht auch?


----------



## mihe7 (24. Jul 2018)

Die Frage an sich ist gut, auch die "Präsentation" der Frage. Mit der Fragestellung selbst habe ich eher meine Probleme.

Zum Thema: evtl. sollte man etwas wie eine MultiCellValueFactory einführen, um eine ähnliche Funktionalität wie JTable#setDefaultRenderer zu erhalten.


----------



## Xyz1 (24. Jul 2018)

Ich habe es jetzt mal so gemacht:
(Daten 1)

```
abstract class APerson {
    abstract TRow getTRow();
}

class Person extends APerson {
    private final String nname;
    private final String vname;

    Person(String nname, String vname) {
        this.nname = nname;
        this.vname = vname;
    }

    @Override
    TRow getTRow() {
        return new TRow(new TCol[]{
            new TCol(nname),
            new TCol(vname),
            new TCol("Person keine MN"),
            new TCol("Person kein NC"),
            new TCol("Person keine WS"),});
    }
}

class Student extends Person {
    private final String matrikeln;
    private final String nc;

    Student(String nname, String vname, String matrikeln, String nc) {
        super(nname, vname);
        this.matrikeln = matrikeln;
        this.nc = nc;
    }

    @Override
    TRow getTRow() {
        TRow tRow = super.getTRow();
        return new TRow(new TCol[]{
            tRow.getTCol(0),
            tRow.getTCol(1),
            new TCol(matrikeln),
            new TCol(nc),
            new TCol("Student keine WS"),});
    }
}

class SMitarbeiter extends Student {
    private final int wochens;

    SMitarbeiter(String nname, String vname, String matrikeln, String nc, int wochens) {
        super(nname, vname, matrikeln, nc);
        this.wochens = wochens;
    }

    @Override
    TRow getTRow() {
        TRow tRow = super.getTRow();
        return new TRow(new TCol[]{
            tRow.getTCol(0),
            tRow.getTCol(1),
            tRow.getTCol(2),
            tRow.getTCol(3),
            new TCol(((Integer) wochens).toString()),});
    }
}
```

mit (Daten 2)

```
class TCol {
    private final String s;

    TCol(String s) {
        this.s = s;
    }

    String getString() {
        return s;
    }
}

class TRow {
    private final TCol[] tc;

    TRow(TCol[] tc) {
        this.tc = tc;
    }

    TCol getTCol(int x) {
        return tc[x];
    }
}
```

mit ("Oberfläche")

```
class ListOfPersons {
    public static void main(String[] args) {
        ListOfPersons listOfPersons = new ListOfPersons(new Person[]{
          
            new Student("fällt keiner", "ein1", "123", "1.23"),
            new Student("fällt keiner", "ein2", "321", "3.21"),
            new SMitarbeiter("fällt keiner", "ein3", "213", "3.21", 40),
            new Person("Hausmeister", "schlau"),
      
        });
        JFrame f = new JFrame();
        JTable t = new JTable(new AbstractTableModel() {
            @Override
            public String getColumnName(int column) {
                String[] s = {"Nachname", "Vorname", "Matrikeln", "NC", "WS"};
                return s[column];
            }

            @Override
            public Class<?> getColumnClass(int columnIndex) {
                return String.class;
            }
          
            @Override
            public int getRowCount() {
                return listOfPersons.getPersons().size();
            }

            @Override
            public int getColumnCount() {
                return 5;
            }

            @Override
            public Object getValueAt(int rowIndex, int columnIndex) {
                return listOfPersons.getPersons().get(rowIndex).getTRow().getTCol(columnIndex).getString();
            }
        });
      
        f.getContentPane().add(new JScrollPane(t));
        f.setSize(800, 200);
        f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        f.setVisible(true);
    }

    private final List<APerson> persons;

    ListOfPersons(APerson[] p) {
        persons = Arrays.asList(p);
    }

    List<APerson> getPersons() {
        return persons;
    }
}
```

. @mrBrown , die Zuständigkeiten sind getrennt, so stimmt das.

Oberfläche:


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> . @mrBrown , die Zuständigkeiten sind getrennt, so stimmt das.


Die Zuständigkeit der Person ist es jetzt, zu wissen, wie die Tabelle aufgebaut ist. Das ist Bullshit.


Vor allem ist die Vererbungshierarchie völliger Blödsinn, jede Klasse in der Personen-Hierarchie muss jetzt wissen, welche Attribute alle anderen Klassen haben.


----------



## Xyz1 (24. Jul 2018)

@mrBrown Was du als " Bullshit " bezeichnest, ist die hiernach gefragte Vererbung....

Wie immer gilt: Liefere ein valides Gegenargument - oder bezeichne Anderes nicht als Bullshit....

Du willst doch vielleicht mal in der SE tätigk werden - oder sogar ein Projekt leiten.... Dabei hast du noch viel an Deinem Verhalten zu ändern - sofern alle dich nicht mögen sollen.


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> @mrBrown Was du als " Bullshit " bezeichnest, ist die hiernach gefragte Vererbung....


Nein.
Die Vererbung ist okay. Bullshit ist es, die Darstellung in die Domäne hineinzuziehen (das genaue Gegenteil von "Zuständigkeiten sind getrennt") und es dabei erforderlich zu machen, dass alle Klassen die Attribute aller anderen Klassen kennen.



DerWissende hat gesagt.:


> Wie immer gilt: Liefere ein valides Gegenargument - oder bezeichne Anderes nicht als Bullshit....


Hab ich, mehrfach, du müsstest nur lesen und verstehen. Im Gegensatz zu dir kann ich meine Aussagen begründen.


----------



## Xyz1 (24. Jul 2018)

`Person`, `Student` und `SMitarbeiter` müssen zumindest wissen (ein Attribut haben), an ab welcher Position sie (ihre Attribute) in einer Zeile eingefügt werden müssen. Eine *scharfe* Trennung ist das auch nicht....


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> Person, Student und SMitarbeiter müssen zumindest wissen (ein Attribut haben)


Sie müssen auch wissen, welche Werte aus allen anderen Klassen angezeigt werden, um Platzhalter darzustellen -> Starke (aber nicht mal vom Compiler prüfbare) Kopplung zwischen allen Klassen der Hierarchie.



DerWissende hat gesagt.:


> an ab welcher Position sie (ihre Attribute) in einer Zeile eingefügt werden müssen


Eben, die Klassen müssen wissen, wie sie dargestellt werden -> Starke Kopplung von Domäne an View.
Und daraus folgend: keine Möglichkeit, die View anzupassen. Nicht mal möglich, die Tabellenspalten umzusortieren.


----------



## mihe7 (24. Jul 2018)

Ich dachte eher an so was (ungetestet):


```
import java.util.HashMap;
import java.util.Map;

import javafx.beans.property.ReadOnlyStringProperty;
import javafx.beans.property.ReadOnlyStringWrapper;
import javafx.beans.value.ObservableValue;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.util.Callback;

public class MultiCellValueFactory<S,T> implements Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> {
    private final Map<Class<? extends S>, Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>>> factories =
        new HashMap<>();

    public void setCellValueFactory(Class<? extends S> clazz, Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> factory) {
        factories.put(clazz, factory);
    }

    @Override
    public ObservableValue<T> call(CellDataFeatures<S,T> data) {
        if (data.getValue() != null) {
            Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> cb =
                factories.get(data.getValue().getClass());
            if (cb != null) {
                return cb.call(data);
            }
        }
        return null;
    } 
}
```

Und dann

```
MultiCellValueFactory<Person,String> mcvf = new MultiCellValueFactory<Person,String>();
mcvf.setCellValueFactory(Student.class, data -> return new SimpleStringProperty("Keine WS"));
mcvf.setCellValueFactory(SMitarbeiter.class, data -> return new SimpleStringProperty(((SMitarbeiter) data.getValue()).getWochenstunden().toString()));
...
col4.setCellValueFactory(mcvf);
```


----------



## Xyz1 (24. Jul 2018)

WO IST DIE VERERBUNG UND DIE POLYMORPHIE??  @mihe7


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> WO IST DIE VERERBUNG UND DIE POLYMORPHIE??  @mihe7


Stellst du dich extra so dumm?
Die Vererbung ist schon in der Frage vorhanden, da hat sich bis hier nichts geändert.

Person <|-- Student <|-- SMitarbeiter


----------



## mihe7 (24. Jul 2018)

Die Vererbung hast Du in den Domänenklassen Person, Student, SMitarbeiter. Die steckst Du nach belieben in die ListOfPerson. MultiCellValueFactory ersetzt das statische "instanceof" durch eine dynamische Map. Durch
`mcvf.setCellValueFactory(SMitarbeiter.class, f);`
kann man in f sicher sein, dass data.getValue() auf SMitarbeiter gecastet werden kann


----------



## Xyz1 (24. Jul 2018)

mihe7 hat gesagt.:


> mcvf.setCellValueFactory(Student.*class*, data -> *return* *new* SimpleStringProperty("Keine WS"));


Das Problem ist einfach dass `mcvf`/CellValueFactory einfach eine cast-Fallunterscheidung durchführt und damit das Liskovsche' Substitutionsprinzip nicht einhält. (eines der *SOLID-Prinzipien ....*)

damit könnte man sich die Vererbung ja gleich "schenken"....

Nebenbei, Wem langweilig ist, der kann hier mal lesen: https://softwareengineering.stackex...-you-explain-separation-of-concerns-to-others



mrBrown hat gesagt.:


> Stellst du dich extra so dumm?


nein, denke schon auch nach.


----------



## mrBrown (24. Jul 2018)

DerWissende hat gesagt.:


> Das Problem ist einfach dass mcvf/CellValueFactory einfach eine cast-Fallunterscheidung durchführt und damit das Liskovsche' Substitutionsprinzip nicht einhält. (eines der *SOLID-Prinzipien ....*)



Dann erklär doch mal bitte detailliert, warum dabei das Liskovsche Substitutionsprinzip gebrochen wird? 
Das ist doch für einige hier interessant, und wenn man so ein Wissen hat, will man doch auch andere dran teilhaben lassen


----------



## Meniskusschaden (24. Jul 2018)

DerWissende hat gesagt.:


> Du willst doch vielleicht mal in der SE tätigk werden - oder sogar ein Projekt leiten.... Dabei hast du noch viel an Deinem Verhalten zu ändern - sofern alle dich nicht mögen sollen.


Ähm, das heißt, falls ihn nicht alle nicht mögen sollen, soll er sein Verhalten beibehalten? Warum sollte er denn wollen, dass ihn alle nicht mögen sollen?


----------



## mrBrown (25. Jul 2018)

Meniskusschaden hat gesagt.:


> Warum sollte er denn wollen, dass ihn alle nicht mögen sollen?


Vielleicht, weil jeder es sich insgeheim wünscht, so zu sein wie er?


----------



## Xyz1 (25. Jul 2018)

Meniskusschaden hat gesagt.:


> Ähm, das heißt, falls ihn nicht alle nicht mögen sollen, soll er sein Verhalten beibehalten? Warum sollte er denn wollen, dass ihn alle nicht mögen sollen?


Der letzte Halbsatz


> sofern alle dich nicht mögen sollen.


war logisch nicht richtig. 

Aber es ist witzig dachte fällt gar niemandem auf.
Was/warum kommst du aufeinmal um die Ecke , @Meniskusschaden ?

Fix: 





> Du willst doch vielleicht mal in der SE tätigk werden - oder sogar ein Projekt leiten.... Dabei hast du noch viel an Deinem Verhalten zu ändern - sofern alle zumindest einer dich nicht mögen soll en.


----------



## mihe7 (25. Jul 2018)

DerWissende hat gesagt.:


> Das Problem ist einfach dass mcvf/CellValueFactory einfach eine cast-Fallunterscheidung durchführt und damit das Liskovsche' Substitutionsprinzip nicht einhält. (eines der *SOLID-Prinzipien ....*)



Die MCVF stellt lediglich eine Verbindung zwischen dem Typ S bzw. einem konkreten, von S abgeleiteten Typen und einer zu S passenden CVF her. Wo soll dabei das LSP verletzt werden?


----------



## Xyz1 (25. Jul 2018)

mihe7 hat gesagt.:


> Die MCVF stellt lediglich eine Verbindung zwischen dem Typ S


Hä?


----------



## mihe7 (25. Jul 2018)

public void setCellValueFactory(Class<? extends S> clazz, Callback<TableColumn.CellDataFeatures<S,T>,ObservableValue<T>> factory)

clazz ist vom Typ S oder einem davon abgeleiteten Typ.


----------

