JavaFX 8, ListView mit Checkboxen

7

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.

    
jan 03.03.2015, 23:14
quelle

3 Antworten

20

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,

%Vor%

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 :

%Vor%

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:

%Vor%

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:

%Vor%

oder, noch prägnanter, Methodenverweise :

%Vor%     
James_D 04.03.2015 01:59
quelle
2
%Vor%

Danke! Dies hilft mir, mein Problem zu lösen.

    
user4693191 20.03.2015 08:38
quelle
0

Danke für die vorherigen Antworten. Ich vermisse die Information, dass setCellValueFactory nicht benötigt wird, aber der zugewiesene Wert sollte auch in setCellFactory getan werden. Hier ist mein Ansatz (viel von der vorherigen Lösung kopiert).

%Vor%     
karnbo 30.01.2016 10:54
quelle

Tags und Links