Ich möchte eine einfache ListView erstellen. Ich habe herausgefunden, dass ich die Methode setCellFactory () verwenden kann, aber ich verstehe nicht, wie man sie richtig benutzt. Bisher habe ich:
%Vor%Da "Eigenschaft" ein Callback ist - Callback hat etwas mit bidirektionaler Begrenzung zu tun. Also habe ich ein
erstellt %Vor%Mein Compiler sagt mir, wenn ich einen neuen Callback erstelle, muss ich den Methodenaufruf überschreiben.
Und hier bin ich festgefahren. Was mache ich mit diesem Methodenaufruf? Ich kann es implementieren, aber was soll ich zurückgeben, oder wofür? Ich möchte auf ein beliebiges listItem auf meine Checkbox klicken und "Hi" in der Konsole anzeigen lassen.
Wenn Sie ein ListView<String>
haben, dann ist jedes Element in ListView
ein String
und das CheckBoxListCell.forListView(...)
erwartet eine Callback<String, ObservableValue<Boolean>>
.
In der Vor-Java-8-Denkweise der Dinge, eine Callback<String, ObservableValue<Boolean>>
ist eine Schnittstelle, die eine einzelne Methode definiert,
Sie benötigen also etwas, das diese Schnittstelle implementiert, und Sie übergeben ein Objekt dieses Typs.
Die Dokumentation sagt Ihnen auch, wie dieser Callback verwendet wird:
Ein Rückruf, der bei einem Objekt vom Typ T (das ist ein Wert herausgenommen) der Liste ListView.items), gibt ein ObservableValue, der angibt, ob das angegebene Element vorhanden ist ausgewählt oder nicht. Dieser ObservableValue wird bidirektional gebunden (Das bedeutet, dass die CheckBox in der Zelle diese Eigenschaft aktiviert / deaktiviert) basierend auf Benutzerinteraktionen, und die CheckBox spiegelt den Status von der ObservableValue, wenn er sich extern ändert).
(Da Sie ListView<String>
haben, ist hier T
ist String
.) Für jedes Element in der Listenansicht (jedes Element ist String
) wird der Callback verwendet, um% co_de zu bestimmen %, die bidirektional an den Status des Kontrollkästchens gebunden ist. I.e. Wenn das Kontrollkästchen aktiviert ist, wird diese Eigenschaft auf ObservableValue<Boolean>
gesetzt, und wenn sie nicht markiert ist, wird sie auf true
gesetzt. Umgekehrt, wenn die Eigenschaft programmgesteuert auf false
(oder true
) gesetzt ist, ist das Kontrollkästchen aktiviert (oder deaktiviert).
Der typische Anwendungsfall hier ist, dass der Elementtyp in false
einen ListView
als Teil seines Status hat. Sie würden dies normalerweise mit einer Art benutzerdefinierter Klasse verwenden, die Ihre Daten darstellt, wie folgt mit der inneren Klasse BooleanProperty
:
Wenn Sie wirklich eine Item
haben, ist es nicht wirklich klar, was die Eigenschaft ist, die Sie setzen, indem Sie auf das Kontrollkästchen klicken. Aber es gibt nichts, was Sie davon abhalten könnte, einen im Rückruf zu erstellen, nur um an den ausgewählten Status des Kontrollkästchens zu binden:
Beachten Sie, dass in diesem Fall die ListView<String>
s möglicherweise häufig erstellt und verworfen werden. Dies ist wahrscheinlich in der Praxis kein Problem, aber es bedeutet, dass die erste Version mit der dedizierten Modellklasse bessere Ergebnisse bringt.
In Java 8 können Sie den Code vereinfachen. Da die Schnittstelle BooleanProperty
nur eine abstrakte Methode hat (was sie zu einer funktionalen Schnittstelle macht), können Sie sich eine Callback
als Funktion vorstellen, die eine Callback<Item, ObservableValue<Boolean>>
und eine Item
generiert. So könnte die Zellenfabrik im ersten Beispiel mit einem Lambda-Ausdruck geschrieben werden:
oder, noch prägnanter, Methodenverweise :
%Vor%