2016-06-20 13 views
3

Ich versuche, die Auswahl eines ComboBox wie folgt zurück:JavaFX ComboBox OnChangeListener Rollback Änderung

// private ListView<MyEntityType> f_lItems 

f_lItems.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<Object>() { 
    @Override 
    public void changed(ObservableValue<?> ov, Object t, Object t1) { 
     if (t1 != null && t1 instanceof MyEntityType) { 

      MyEntityType pv = (MyEntityType) t1; 
      // do some condition testing 
      if (condition) { 
       // accept 
      } else 
       // roll back to previous item 
       f_lItems.getSelectionModel().select((MyEntityType) t); 
      } 
     } 
    } 
}); 

So, nachdem ich diese Ausnahme erhalten versuchen, die Liste auf den alten Wert zurückgesetzt werden:

Exception in thread "JavaFX Application Thread" java.lang.IndexOutOfBoundsException 
    at com.sun.javafx.scene.control.ReadOnlyUnbackedObservableList.subList(Unknown Source) 
    at javafx.collections.ListChangeListener$Change.getAddedSubList(Unknown Source) 
    at com.sun.javafx.scene.control.behavior.ListViewBehavior.lambda$new$177(Unknown Source) 
    at javafx.collections.WeakListChangeListener.onChanged(Unknown Source) 
    at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(Unknown Source) 

Wie es scheint, bekomme ich nicht das zugrunde liegende Verhalten von List s/ObservableList s für diesen Fall.

Hat jemand Vorschläge, wie ich das schaffen könnte?

Vielen Dank im Voraus Adam

+0

Was genau meinen Sie mit "reset die Auswahl einer' ComboBox'? Soll die 'ComboBox' das ausgewählte Element standardmäßig jedes Mal haben, wenn Sie ein anderes auswählen? – SpaceCore186

+0

Was Sie machen wollen ? Geben Sie ein Beispiel, mit diesem Ansatz können Sie StackOverflowError Fehler haben ... – GOXR3PLUS

+0

Sagen wir, der ausgewählte Index war 4. Der Benutzer hat den Index auf etwa 6 gesetzt. In der geänderten Handler möchte ich den Index wieder auf 4, weil von einigen internen Gründen. Wirklich möchte ich verwirklichen das "sind Sie wirklich sicher, dass Sie Ihre Auswahl" Sache ändern möchten. Andererseits dachte ich, dass dieses nicht der rechte Weg irgendwie sein sollte, es zu tun. Möglicherweise muss ich verhindern das veränderte Ereignis an erster Stelle – PAWL

Antwort

0

Basierend auf Ihrem Kommentar, was Sie wollen, ist: Wenn der (ausgewählte) Wert der ComboBox geändert wird, überprüfen Sie für eine Bedingung, und dann, wenn diese Bedingung nicht erfüllt ist, zurück die Wert des ComboBox Wertes zum vorherigen.

Dazu können Sie zum Beispiel den valueProperty der ComboBox mit einem Listener verwenden. Der Listener-Body dient lediglich dazu, auf die Bedingung zu prüfen, und die Wertaktualisierung ist in einem Platform.runLater{...}-Block verschachtelt.

Beispiel

Im Beispiel ist es ein ComboBox die sich nur auf „Two“ eingestellt werden kann.

ComboBox<String> cb = new ComboBox<String>(FXCollections.observableArrayList("One", "Two", "Three", "Four")); 

cb.valueProperty().addListener(new ChangeListener<String>() { 

    @Override 
    public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) { 
     // If the condition is not met and the new value is not null: "rollback" 
     if(newValue != null && !newValue.equals("Two")){ 

      Platform.runLater(new Runnable(){ 
       @Override 
       public void run() { 
        cb.setValue(oldValue); 
       }}); 
     } 
    } 
}); 

... oder Sie können die selectedItemProperty auch mit der gleichen Struktur verwenden ...

cb.getSelectionModel().selectedItemProperty().addListener((obs, oldVal, newVal)->{ 
    if(newVal != null && !newVal.equals("Two")){ 
     Platform.runLater(() -> cb.setValue(oldVal)); 
    } 
}); 

Hinweis: Diese Lösung ist nicht auf die Auswahl „zu verhindern“, so wie in der titel: "roll-back" eine bereits durchgeführte auswahl.

+0

Das war genau das, was ich gesucht habe. – PAWL

Verwandte Themen