Ich habe eine ListView
und es hat eine ChangeListener
zu seiner selectedItemProperty()
hinzugefügt. Es ist irgendwie möglich, den Hörer zu entkräften, wenn im Innern des Hörers eine Bedingung truefor Beispiel ist:JavaFx: ungültig ChangeListener
listView.getSelectionModel().selectedItemProperty().addListener(
(observable, oldValue, newValue) -> {
if (thereIsUnsavedData()) {
// invalidate somehow so to don't change from item A to B
} else{
// load the content of the newValue
}
});
Ich konnte machen, dass nichts tun, wenn die Bedingung erfüllt ist, ändert aber immer noch die Auswahl in listView
, und das ist nicht die Lösung zu listView.getSelectionModel(). select (oldValue); weil es den Zuhörer wieder triggert. Irgendeine Idee?
Edit:
So sehe ich es einige Missverständnisse, lässt sie so klären:
Wenn der Benutzer klickt auf ein anderes Element in der listView
, die nicht die aktuelle und auf der aktuellen Ansicht ist nicht gespeicherten Daten sind , dann erscheint ein Dialog
und fragt den Benutzer: Es sind nicht gespeicherte Daten möchten Sie fortfahren? mit Ja/Nein Antworten. Wenn der Benutzer wählte Ja dann ist alles in Ordnung, lassen Sie ihn die Ansicht ändern, aber wenn er Nein wählte dann sollte die tatsächliche Ansicht gehalten werden. Daher ist jeder Vorschlag, die Elemente zu deaktivieren, in meinem Fall falsch. Ich fand hier eine Lösung ist, aber ich bin nicht sicher, es optimal ist oder nicht:
private ChangeListener<Item> changeListener =
(observable, oldValue, newValue) -> {
if (thereAreUnsavedData()) {
listView.getSelectionModel().selectedItemProperty().removeListener(getListener());
Platform.runLater(() -> {
listView.getSelectionModel().select(oldValue);
listView.getSelectionModel().selectedItemProperty().addListener(getListener());
});
} else {
loadSelected(newValue);
}
};
Betrachtet SelectionModel.selectedItem ist eine [schreibgeschützte Eigenschaft] (http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#selectedItemProperty), ich nicht denke du kannst seinen Wert beeinflussen. Beachten Sie außerdem, dass das Ändern des Verhaltens eines Standardsteuerelements die Benutzer frustrieren kann. – VGR
Ich möchte seinen Wert nicht ändern, sondern nur aufhören, von einem Element zu einem anderen zu wechseln, wenn eine Bedingung wahr ist, wie Sie in der Frage sehen können. – Sunflame
Sie könnten auch Ihr eigenes 'SelectionModel' schreiben, um die Auswahl" unsave data "unmöglich zu machen. – Jibbow