我的问题是,当ListView
更改时,我的ObservableList
(复选框列表视图)不会更新。
当我使用JavaFX的日期版本和日期JRE(jre6和jfx2.2)时,才会出现此问题。当我使用jre8和它包含的JavaFX时,问题就消失了,列表也很好地刷新了。
上述最新JavaFX的工作源代码:
清单:
public ObservableList<TestCaseCheckboxModel> TestCases;
//Constructor
public SessionTestCaseModel() {
TestCases = FXCollections.observableArrayList(new Callback<TestCaseCheckboxModel, Observable[]>(){
@Override
public Observable[] call(TestCaseCheckboxModel model) {
return new Observable[]{model.TestCaseName, model.TestCaseStatus, model.TestCaseSelected};//selected might not be needed since it's bound to the listview anyways
}
});
}
列表使用的类具有以下属性:
public StringProperty TestCaseName = new SimpleStringProperty();
public IntegerProperty TestCaseStatus = new SimpleIntegerProperty();
public BooleanProperty TestCaseSelected = new SimpleBooleanProperty();
列表在外部填充。
ListView
:
@FXML
private ListView<TestCaseCheckboxModel> testcaseListView;
//bind the checkbox select to the model property
testcaseListView.setCellFactory(CheckBoxListCell.forListView(new Callback<TestCaseCheckboxModel, ObservableValue<Boolean>>() {
@Override
public ObservableValue<Boolean> call(TestCaseCheckboxModel item) {
return item.TestCaseSelected;
}
}));
//initiate the checkbox list view with the model items
testcaseListView.setItems(getModel().TestCases);
问题在于,当我更改List项时,ListView不会对旧的JavaFX版本进行更改。
值得一提的是,在我从列表中添加/删除项目后,列表中的项目会更新(就像他们自己更改时一样)。但是,据我所知,调用列表的add
函数会触发ListView
更新,无论如何。
另一方面,当项目属性发生变化时,这将触发旧的和新的JavaFX版本,因此Callback
提取器按预期工作:
getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){
@Override
public void onChanged(Change change) {
System.out.println(change);
}
});
是否有针对此的已知解决方法?
感谢您的帮助。
答案 0 :(得分:1)
在此主题的帮助下回答我自己的问题: https://stackoverflow.com/a/25962110/4073727
我实现了一个自定义ListViewSkin
,它能够从内部更新ListView&#34;&#34;:
public class UpdateableListViewSkin<T> extends ListViewSkin<T> {
public UpdateableListViewSkin(ListView<T> arg0) {
super(arg0);
}
public void refresh() {
super.flow.recreateCells();
}
}
然后我将ObservableList
添加到ListView
,实例化Skin
并将其设置为ListView
。
//initiate the checkbox list view with the model items
testcaseListView.setItems(getModel().TestCases);
UpdateableListViewSkin<TestCaseCheckboxModel> skin = new UpdateableListViewSkin<TestCaseCheckboxModel>(testcaseListView);
testcaseListView.setSkin(skin);
关键是您需要向onChange
添加一个有效的ObservableList
侦听器,这将触发Skin
的{{1}}方法。我将.refresh()
设置为Skin
:
ListView
此解决方法会触发getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){
@SuppressWarnings("unchecked")
@Override
public void onChanged(Change change) {
((UpdateableListViewSkin<TestCaseCheckboxModel>)testcaseListView.getSkin()).refresh();
}
});
的更新功能,就像在新版JavaFX上一样。