2017-05-27 10 views
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を停止する方法を知っていますか?

セバスチャンは

答えて

1

あなたは、リスナーが発射されるべきかどうかを示すために、単純なフラグを追加することができます。

public class DeviceConfigurationController { 

    @FXML private ListView<DeviceConfiguration> device_list; 
    private boolean pauseListener; 

    @FXML 
    private void initialize() { 
     device_list.getSelectionModel().selectedItemProperty().addListener((observable, oldValue, newValue) -> { 
      if(!pauseListener) 
       UndoManager.add(new ListViewSelectionChange<>(oldValue, device_list)); 
      }    
     }); 
    } 

    @FXML 
    private void undo() { 
     pauseListener = true; 
     UndoManager.undo(); 
     pauseListener = false; 
    } 
} 
+0

私はこれを考えていませんでした。 私は機能インタフェースを追加しました。機能インタフェースはun/redoとafterの前に呼び出されます。そこでは、pauseListenerのようなブール値を変更できます。 ありがとう – Frame

関連する問題