我不知道我是否正确理解了您的问题,但我会尽力回答:-)。
问题是,一旦 ObservableList (javafx.collections) 对象不存储某种“选定”索引状态,我们为什么要绑定另一个整数呢?
我认为,在这种情况下,您的代码应该负责存储“选定”索引状态并将其公开给客户端代码。如果这是你要找的,我建议你有三个属性来处理它:
public class ListSelection<T> {
private ObservableList<T> items = FXCollections.observableArrayList(new ArrayList<T>());
private ObjectProperty<T> selectedItem = new SimpleObjectProperty<>();
private IntegerProperty selectedIndex = new SimpleIntegerProperty(0);
}
可以使用selectedIndex
属性来控制所选元素。
然后,创建一个绑定到selectedItem
, 以在更改时“自动”更新它selectedIndex
:
selectedItem.bind(
when(isEmpty(items))
.then(new SimpleObjectProperty<T>())
.otherwise(valueAt(items, selectedIndex))
);
Bindings
应该是静态导入的:
import static javafx.beans.binding.Bindings.*;
注意方法的使用Bindings.valueAt(ObservableList<E> list, ObservableIntegerValue index)
。它创建到list.get(index.getValue())
元素的绑定。
最后,您可以像这样使用它:
ListSelection<String> selection = new ListSelection<>();
Label label = new Label();
List<String> weekDays = Arrays.asList("monday", "tuesday", "wednesday", "thursday", "friday", "saturday", "sunday");
selection.getItems().addAll(weekDays);
label.textProperty().bind(selection.selectedItemProperty());
我还建议您查看javafx.scene.control.SelectionModel
类及其子类(例如。javafx.scene.control.SingleSelectionModel
)。也许,扩展其中一些可能更容易。