将JavaFx ListView的选择索引绑定到整数属性

时间:2015-09-25 12:19:22

标签: java listview data-binding javafx

是否可以将ListView的选择索引或项绑定(单向)到属性?

我可以使用此调用获取ReadOnlyIntegerProperty,但它是一个ReadOnlyProperty,它没有您在ObjectPropertyStringProperty等中看到的绑定方法。

myListView.getSelectionModel().selectedIndexProperty()

如何将Integer属性绑定到ListView的选定索引属性?

2 个答案:

答案 0 :(得分:3)

API将selectedIndex公开为ReadOnlyProperty,因为它不希望公开属于bind API的Property方法。它不希望公开bind方法的原因是ListView需要能够在用户点击它时设置该属性。如果bind方法是API的一部分,并且程序员调用listView.getSelectionModel().selectedIndexProperty().bind(...),则只要用户单击列表,就会生成运行时错误。

由于bindBidirectional也是Property API的一部分,而不是ReadOnlyProperty API的一部分,这意味着您也无法双向绑定selectedIndex

使用两个侦听器可以实现与双向绑定相同的效果:

IntegerProperty property = new SimpleIntegerProperty();
ListView<?> listView = new ListView<?>();

// change property when selection changes:
listView.getSelectionModel().selectedIndexProperty().addListener((obs, oldIndex, newIndex) ->
    property.set(newIndex.intValue()));

// change selection when property changes:
property.addListener((obs, oldValue, newValue) -> 
    listView.getSelectionModel().clearAndSelect(newValue.intValue())); 

如果您只想将所选项索引绑定到属性,则只需要第二个侦听器。

如果您只想将属性绑定到选定的项索引,并且您不打算通过其他方式设置该属性,那么您当然可以绑定该属性:

IntegerProperty property = new SimpleIntegerProperty();
property.bind(listView.getSelectionModel().selectedIndexProperty());

(虽然在这种情况下,如果您的设计允许,您可以直接引用selectedIndexProperty。)

答案 1 :(得分:1)

  

我可以阅读不允许biDirectionalBinding,因为它可以阅读   只是,但我怎么能单行绑定?

尝试:

for(int i = 0; i < 10; cout << array[i++]);