0
私はListViewを持っており、ユーザーが選択を変更したときにselectedItemPropertyを聴いています。JavaFXの元に戻すリストビューの選択
このリスナーでは、UndoManagerにイベントを追加します。選択を取り消そうとすると、selectedItemPropertyはChangeListenerを起動し、UndoMangerに他のイベントを追加し、UndoMangerにListViewSelectionChangeを追加するので、無限ループを作成します。
public class DeviceConfigurationController {
@FXML private ListView<DeviceConfiguration> device_list;
@FXML
private void initialize() {
device_list.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> {
UndoManager.add(new ListViewSelectionChange<>(oldValue, device_list));
});
}
//redo/undo stuff
@FXML
private void undo() {
UndoManager.undo(); //calls the last Change
}
}
public class ListViewSelectionChange<T> implements Change {
privateT lastValue;
private T redoValue;
ListView<T> listView;
public ListViewSelectionChange(T lastValue, ListView<T> listView) {
this.lastValue = lastValue;
this.listView = listView;
}
//gets called from the undomanager
@Override
public void undo() {
redoValue = listView.getSelectionModel().getSelectedItem();
listView.getSelectionModel().select(lastValue); //fires the selection listener again, thus adding a ListViewSelection to the UndoManager
}
}
誰かがリスナーの呼び出しからlistviewを停止する方法を知っていますか?
セバスチャンは
私はこれを考えていませんでした。 私は機能インタフェースを追加しました。機能インタフェースはun/redoとafterの前に呼び出されます。そこでは、pauseListenerのようなブール値を変更できます。 ありがとう – Frame