item for eventos change java javafx combobox listener

for - Cambio de reversión de JavaFX ComboBox OnChangeListener



eventos combobox javafx (1)

Según su comentario, lo que quiere es: Cuando se cambia el valor (seleccionado) del ComboBox , compruebe si hay alguna condición y, si no se cumple esta condición, restablezca el valor del ComboBox valor anterior.

Para esto puede usar, por ejemplo, valueProperty del ComboBox con un oyente. El cuerpo del oyente es solo para verificar la condición y la actualización del valor está anidada en un bloque Platform.runLater{...} .

Ejemplo

En el ejemplo, es un ComboBox que se puede configurar solo en "Dos".

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); }}); } } });

... o puede usar selectedItemProperty también con la misma estructura ...

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

Nota: Esta solución no es para "evitar" la selección, como en el título: "retroceder" una selección ya realizada.

Estoy tratando de restablecer la selección de un ComboBox siguiente manera:

// 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); } } } });

Entonces, después de intentar restablecer la lista al valor anterior, recibo esta excepción:

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)

Como parece, no obtengo el comportamiento subyacente de List s / ObservableList s para este caso.

¿Alguien tiene sugerencias de cómo podría hacer que esto funcione?

Gracias de antemano Adam