2017-02-17 1 views
1

Ich muss eine Schaltfläche in meiner Anwendung deaktivieren, sofern nichts ausgewählt ist oder mehrere Zeilen ausgewählt sind.JavaFX TableView-Auswahl Bindung wird nicht immer ausgelöst - gibt es eine bessere Arbeit?

Ich habe die folgende Bindung (zusätzlichen Code, es zu debuggen, da es nicht funktionierte) .. mir

BooleanBinding singleDocIsntSelected = 
       Bindings.createBooleanBinding(() -> { 
        boolean result = documentTable.getSelectionModel().getSelectedItems().size() != 1; 
        return result; 
       }, documentTable.getSelectionModel().selectedItemProperty()); 

Was passiert, ist, dass, wenn ich die erste Zeile auswählen, es feuert, dann, wenn ich STRG + Klicken Sie auf die gleiche Zeile, es wird erneut ausgelöst. Bis jetzt ist alles gut in der Welt. Dann klicke ich auf die selbe Zeile - nichts, oder wenn ich STRG klicke Andere Zeilen nichts.

Meine Taste bleibt im falschen Zustand.

Wenn ich aber auch ein Zuhörer auf die Eigenschaft hinzufügen:

ChangeListener<MyDTO> selectedItemsListener = (obs, ov, nv) -> { 
    boolean result = table.getSelectionModel().getSelectedItems().size() != 1; 
    System.err.println(result); 
}; 

Dann funktioniert alles einwandfrei.

Gibt es keinen anderen Weg, damit umzugehen?

+0

Ich habe das versucht - das gleiche Problem. –

Antwort

2

Sie müssen die Bindung für ungültig erklärt werden, wenn die Liste von Änderungen Elemente ausgewählt wird, nicht wenn die selectedItemEigenschaft Änderungen. Wenn ein Artikel ausgewählt wird, wird dieser zum ausgewählten Artikel: Wenn Sie dann zusätzliche Artikel auswählen, wird der selectedItemProperty nicht geändert (es ist immer noch der erste von allen ausgewählten).

Ihre aktuelle Idiom verwenden, binden nur an die ausgewählten Elemente Liste:

BooleanBinding singleDocIsntSelected = 
    Bindings.createBooleanBinding(() -> { 
     boolean result = documentTable.getSelectionModel().getSelectedItems().size() != 1; 
     return result; 
    }, documentTable.getSelectionModel().getSelectedItems()); 

oder, einfacher,

BooleanBinding singleDocIsntSelected = 
    Bindings.createBooleanBinding(
     () -> documentTable.getSelectionModel().getSelectedItems().size() != 1, 
     documentTable.getSelectionModel().getSelectedItems()); 

Obwohl es wahrscheinlich sauberer ist Bindings.size() und IntegerBinding.isNotEqualTo() zu verwenden:

BooleanBinding singleDocIsntSelected = Bindings 
    .size(documentTable.getSelectionModel().getSelectedItems()) 
    .isNotEqualTo(1); 
Verwandte Themen