我有一個ListView
它有一個ChangeListener
添加到其selectedItemProperty()
。有可能以某種方式無效聽衆,如果聽衆裏面的一些條件是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',使其無法選擇「unsave data」 – Jibbow