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