当ObservableList在JRE6 JavaFX2.2上发生更改时,JavaFX ListView没有更新

时间:2016-08-17 10:41:30

标签: listview javafx observablelist

我的问题是,当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);
        }
    });

是否有针对此的已知解决方法?

感谢您的帮助。

1 个答案:

答案 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上一样。