私はListView
を持っていて、そのselectedItemProperty()
にはChangeListener
が追加されています。リスナーの内側にいくつかの条件がtruefor例である場合は、リスナーを無効にする何とか可能です:JavaFx: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
}
});
私は条件が真であるが、それでも
listView
での選択が変化し、それがないときは何もしないでくださいその作ることができ
listView.getSelectionModel()への解答。select(oldValue);それはリスナーを再びトリガするからです。
編集:
は、だから私は、いくつかの誤解がある見るので、それらを明確にすることができます:
現在と現在のビューにないlistView
内の他の要素をユーザーがクリックすると保存されていないデータのときDialog
がポップアップし、ユーザーに尋ねます:保存していないデータがありますか?とはい/いいえの回答。ユーザーがはいを選択した場合はすべてはに変更しますが、を選択した場合はと表示されます。私の場合、要素を無効にするための提案は間違っています。私はそれがここに解決策を見つけたが、私はそれが最適であるかどうかについてはよく分からない:
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);
}
};
SelectionModel.selectedItemは[読み取り専用のプロパティ](http://docs.oracle.com/javase/8/javafx/api/javafx/scene/control/SelectionModel.html#selectedItemProperty)であることを考慮すると、あなたがその価値に影響を与えることができると思います。また、標準コントロールの動作を変更すると、ユーザーが不満を感じる可能性があることにも注意してください。 – VGR
私はその値を変更したくないのですが、質問でわかるように、条件が真であれば項目から別の項目への変更をやめてください。 – Sunflame
あなたは、「保存していないデータ」を選択することができないようにあなた自身の 'SelectionModel'を書くこともできます – Jibbow