ListView nach Erweiterung Fehler in CellFactory

Tintenfisch

Bekanntes Mitglied
Hallo,
ich habe eine ListView, welch grundsätzlich ihre Daten aus einem Array bekommt. Die CellFactory färbt je nach Inhalt der Zelle diese dementsprechend ein.
Die Daten, welche von vornherein Gespeichert sind und somit schon bei Programmstart gezeigt werden, durchlaufen die CellFactory auch einwandfrei und werden fehlerfrei angezeigt.
Wenn nun allerdings weitere Daten hinzugefügt werden, werden Zellen eingefärbt, dessen Inhalt diesem eigentlich gar nicht entspricht.
An der Speicherung kann es an sich nicht liegen, da die Daten an anderer Stelle ebenso in einer TableView gezeigt werden und es dort keine Probleme mit fehlerhaften Zellfarben gibt.
Um die ListView nach Erweiterung des Arrays mit dessen neunen Inhalt zu füllen, rufe ich erneut die Methode auf, in welcher die Daten aus dem genannten Array in eine ObservableList geschrieben und anschließend dessen Daten mit setItems neu in der ListView gezeigt werden sollen.
Ein erneutes aufrufen der CellFactory hat an der Stelle keinen erkennbaren Effekt.
Wenn Code benötigt wird, gerne ansprechen, ansonsten schon einmal danke fürs lesen.
 
Hier mal die Hauptbeteiligten. Die Werte werden immer korrekt übernommen und angezeigt, lediglich die CellFactory macht nach dem hinzufügen weiterer Daten probleme.
[CODE lang="java" title="CellFactory"] public void entryFieldListViewCellFactory () {
this.getEntryListView().setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> arg0) {
// ListCell<String> cell = new ListCell<String>() {
TextFieldListCell<String> cell = new TextFieldListCell<String>() {
@Override
public void updateItem (String item, boolean empty) {
super.updateItem(item, empty);
if (item == null || empty || item == "") {
setText("");
setStyle("");
} else if (item.length() > 1 && item.substring(0, 2).equals("#v")) {
getStyleClass().add("vacation");
setText(item.substring(2));
} else {
setText(item);
getStyleClass().add("zerocolor");
}
}
};

return cell;
}
});
}[/CODE]
[CODE lang="java" title="Die Funktion des Buttons, welcher den neuen Inhalt ins Array schreibt (und anschließend den neuen Inhalt in der ListView ausgibt)"]public static void addEntryBt (EntryField entryField, CalendarTable calendarTable, User user1, User user2, User user3) {
entryField.getAddEntryBt().setOnAction(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent arg0) {
entryField.entryToArray();
EntryField.entryDateFillLiVi(entryField);
entryField.entryFieldListViewCellFactory();

}});}[/CODE]
[CODE lang="java" title="Die Funktion, welche den Inhalt des Arrays in die ObservableList übernimmmt und in ListView zeigt"]public static void entryDateFillLiVi (EntryField entryField) {
ObservableList<String> entryList = FXCollections.observableArrayList();
for (int i = 0; i < User.userNameGetItems(entryField.getUsersBox().getValue(), Date.indexOf(entryField.getEntryDate())).size(); i ++) {
if (User.userNameGetItems(entryField.getUsersBox().getValue(), Date.indexOf(entryField.getEntryDate())).size() != 0) {
entryList.addAll(User.userNameGetItem(entryField.getUsersBox().getValue(), Date.indexOf(entryField.getEntryDate()), i));
}
}
entryField.getEntryListView().setItems(entryList);
}[/CODE]
 
Zuletzt bearbeitet:
Du greifst mit static aber nicht auf die Instanz einer Klasse zu.

Ich will dich nicht entmutigen - und möglicherweise liege ich ja auch falsch - aber ich würde dir raten, dich zunächst einmal mit den Grundlagen von Java zu beschäftigen, bevor du Oberflächen (GUI) entwirfst.
Auf ein Attribut einer Instanz dieser Klasse meinte ich. Aber ja, ich stehe wirklich auch gerade noch am Anfang und der Korrekte weg ist das sicher nicht. Allerdings funktioniert es, weshalb ich es auch erstmal so gemacht hatte. Sicherlich ist dem noch nachzugehen, aber die meisten Sachen erschließen sich nach und nach beim ausprobieren.
An sich aus der Methode mit this auf ein Attribut einer Instanz dieser Klasse zuzugreifen gelingt, aus der "handle" Methode, welche sich in einer Methode der Klasse befindet, allerdings nicht. Deshalb hatte ich erstmal die benötigte Methode static gesetzt, dass ich sie einfach mit dem Klassennamen aufrufen kann.
Aber über einen Tipp wäre sehr dankbar. Anbei mal ein Bsp., es handelt sich um die Methode entrydateFillLiVi, welche derzeit static steht und sich in EntryField befindet. Wie komme ich von dort an das benötigte Attribut?
Java:
public void entryDateFillLiViViaUserBx (EntryField entryField) {
        this.usersBox.setOnAction(new EventHandler<ActionEvent>() {
            @Override
            public void handle(ActionEvent arg0) {
                EntryField.entryDateFillLiVi(entryField);  // die ohne static aufrufen
            }
        });
    }
 
Wenn eine Methode "static" ist, kann sie nicht auf eine Instabz und genauso wenig auf ein Attribut der Instanz zugreifen,
Er scheint die Instanz als Parameter zu übergeben. Somit hat er dann Zugriff auf diese Instanz..

Was aber natürlich an dem schlechten Design, das es zu verbessern gilt, nichts ändert.
 

Neue Themen


Zurück
Oben