Inhalt aus TextField in Attribut einer Instanz schreiben

Tintenfisch

Bekanntes Mitglied
Hey,
ich habe in JavaFX ein ActionEvent, welches über einen Button, einen in ein Textfeld geschriebenen Inhalt in einer Variable einer Instanz schreiben soll. Die Instanz wird ebenso vorher über eine ComboBox abgefragt. Nun, den Text bekomme ich in eine Variable, aber der Zugriff auf die Instanz, über die Angabe aus der ComboBox gelingt nicht. Die Items der ComboBox sind mit den Namen der Instanzen (besser gesagt mit den Namen aus einem Attribut dieser), belegt. Hier liegt glaube ich auch das Problem. Ist es Möglich von dem Inhalt eines Attributes einer Klasse, auf die dazugehörige Instanz zu schließen, oder ist vielleicht der ganze Ansatz nicht das Wahre?



Java:
sendEntry.setOnAction(new EventHandler<ActionEvent>() {

                @Override

                public void handle(ActionEvent arg0) {

                    Object selectedItem = chooseUser.getSelectionModel().getSelectedItem(); // Der Name der Instanz (aus Attribut)

                    String tempEntry = entryTextField.getText();  // Text aus TextField

                }
            });
 
So ich habe noch eine ganze Weile herumprobiert, aber leider funktioniert das ganze noch nicht so wirklich. An sich soll nur:
der Wert aus der ComboBox gelesen und abgeglichen werden,
der passende Index der "dateListe" festgestellt werden, an welche das im DatePicker gewählte Datum vorkommt
und dann den Inhalt des Textfeldes zum selben Index im "entry" (ArrayList) geschrieben werden.
Wäre echt super, wenn dort jemand Hilfestellung geben könnte 🙂

Java:
    sendEntry.setOnAction(new EventHandler<ActionEvent>() {
                @Override
                public void handle(ActionEvent arg0) {
                    LocalDate tempDate = datePickerEntryField.getValue();
                    
                    if (chooseUser.getValue().equals(user1.getName())) {
                        for (int i = 0; dateList().get(i).equals(tempDate); i ++) {
                            user1.getEntry()[i] = entryTextField.getText();
                            System.out.println(user1.getEntry()[i]);
                        }
                    } else if (chooseUser.getValue().equals(user2.getName())) {
                        for (int i = 0; dateList().get(i).equals(tempDate); i ++) {
                            user2.getEntry()[i] = entryTextField.getText();
                            System.out.println(user2.getEntry()[i]);
                        }
                    } else if (chooseUser.getValue().equals(user3.getName())) {
                        for (int i = 0; dateList().get(i).equals(tempDate); i ++) {
                            user3.getEntry()[i] = entryTextField.getText();
                            System.out.println(user3.getEntry()[i]);
                        }
                    }
                }   
            });
 
Also was da erst einmal auffällt:

a) dein if else if else if .... Code:
Hier wäre eine Map angebracht bei der du die User mit Namen als Key speicherst. Dann wird das ein einfaches auslesen des Elements mit dem gegebenen Namen. (Oder alternativ z.B. ein Array oder eine List mit den Usern die Du dann durchgehst ..

b) die for Schleife
Die For-Schleife ist die typische Zählschleife, aber die Bedingung kann ich nicht ganz nachvollziehen. Und wenn das letzte Element auch dem tempDate gleicht, dann hast Du ein Problem weil du dann auf das nächste Element zugreifst, das nicht existiert.
Bist Du Dir sicher, dass die schleife das macht, was Du willst? Was ist da in der dateList? Sind die ersten Elemente alle gleich? Und es gibt dann mindestens ein anderes Element?

c) Clean Code (Nice to have)
user3.getEntry()[i]
Bei sowas fällt auf: getEntry scheint ein Array zurück zu geben, also eher etwas wie getEntries - also Plural.
Und du gibst da ein Array nach außen. Das ist ein Implementierungsdetail, das ich kapseln würde. Die Ob und wie Du die Einträge speicherst geht die Außenwelt nichts an. Und wenn da etwas verändert werden soll, dann ist da eine Methode aufzurufen also sowas wie ein setEntity(int, String) um ein spezifisches Element zu setzen ...
 
Hallo @kneitzel, vielen Dank für die ausführliche Antwort.
Das mit der Map für die Namen ist eine gute Idee, sowohl auch letzteres mit der Methode, um ins Array zu schreiben, versuche ich gleich mal umzusetzen.
Leider macht dieses "Gerüst" absolut nicht das, was es soll, quasi gar nichts. In der dateList sind Daten vom Typ LocalDate, welche ein Jahr abdecken. Jedes Datum ist ein Mal enthalten und tempDate, entspricht genau eines dieser Daten.
 
Aber dann macht die Schleife doch auch keinen Sinn.

Du hast als Bedingung ja:
Java:
dateList().get(i).equals(tempDate)

Angenommen in dateList sind alle Tage vom letzten Monat. tempDate ist der 15te des Monats. Die Schleife wird so lange durchlaufen, wie der Eintrag in DateList gleich dem tempDate ist. Das ist schon beim ersten nicht der Fall, denn das ist ja der 1. und der 1. ist nicht der 15.

Bei sowas ist meine Empfehlung immer, Funktionalität zu kapseln. Erster Schritt ist dazu, weitere Methoden einzuführen. Du kannst also eine Methode haben, die ein Array von LocalDates und ein einzelnes LocalDate bekommt um dann den Index zurück zu geben. Wenn es nicht gefunden wird, dann wird von mir aus -1 zurück gegeben. Das ist eine kleine, einfache Funktionalität:
Java:
public int indexOf(LocalDate[] dateSource, LocalDate dateToFind) {
    for (int index = 0; index < dateSource.size, index++) {
        if (Objects.equals(dateSource[index], dateToFind)) return index;
    }
    
    return -1;
}
(Einfach mal im Forum zusammen geschrieben. Tippfehler bitte ignorieren)

Dann kann man das weiter verändern. Du hast da eine Liste von LocalDates mit irgendwelchen Operationen. Da bietet sich ggf. eine Klasse für an.
Oder man kann Generics nutzen. Dann ersetzt man LocalDate durch T:
Java:
public <T> int indexOf(T[] dateSource, T dateToFind) {
    for (int index = 0; index < dateSource.size, index++) {
        if (Objects.equals(dateSource[index], dateToFind)) return index;
    }
    
    return -1;
}

oder oder oder ... die Welt der Refactorings steht einem halt direkt offen. Aber das Ziel sollte immer sein, einfache kleine Codestücke zu bekommen, die sich dann auch schon fast von alleine erklären.
 

Neue Themen


Zurück
Oben