当前位置: 首页 > 知识库问答 >
问题:

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

吕博耘
2023-03-14

我的问题是,当ObservableList更改时,我的ListView(复选框列表视图)不会更新。

只有当我使用有日期的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();
@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);

问题是,当我更改列表项时,ListView在旧的JavaFX版本上不会改变。

值得一提的是,在我从列表中添加/删除项后,列表中的项会更新(就像它们自己更改时应该更新的那样)。但是,据我所知,调用列表的add函数会触发listview更新。

另一方面,当项属性更改时,新旧JavaFX版本都会触发此操作,因此回调提取器按预期工作:

getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){
         @Override
            public void onChanged(Change change) {
                System.out.println(change);
        }
    });

共有1个答案

吉和同
2023-03-14

通过以下线程的帮助回答我自己的问题:https://stackoverflow.com/a/25962110/4073727

我实现了一个自定义的ListViewSkin,它能够“从内部”更新ListView:

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);

关键是需要向ObservableList添加一个工作的onChange侦听器,这将触发skin.refresh()方法。我在将外观设置为ListView后立即执行了此操作:

getModel().TestCases.addListener(new ListChangeListener<TestCaseCheckboxModel>(){
    @SuppressWarnings("unchecked")
    @Override
        public void onChanged(Change change) {
            ((UpdateableListViewSkin<TestCaseCheckboxModel>)testcaseListView.getSkin()).refresh();
        }
    });

这个解决方案触发listview的更新功能,就像新版本的JavaFX一样。

 类似资料:
  • 问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD

  • 我有一个表视图,每次都很好地填充, 我的主控制器: 我的测试类: 扩展测试类并覆盖其运行的Test1类: 我的aHandler: 因为tbl1绑定到Handler。getInstance()。GetData(),第一次初始化该类时,我看到列Test填充了值1,因为TestData=1;但当计时器开始更改测试数据时,表视图不会获得新的赋值。我做错了什么? 我尽我所能解释这个问题,请让我知道,如果它仍

  • 问题内容: 新手有问题,请保持温柔: 结果是: 我不明白为什么列表改变时,我只是在做,没有。我什至不知道要用什么搜索词来弄清楚。 问题答案: 这是因为在进行分配后,和都引用相同的列表。 尝试执行以下操作以查看它们是指相同的对象还是不同的对象: 一个例子: 如果您确实要创建这样的重复副本,而不是引用原始列表,而是引用列表的副本,请使用slice运算符: 一个例子: 另外,请勿将其用作变量名,因为最初

  • 问题内容: 我用来加载图像。值是从一些范围变量加载的,如下所示: 我的问题是,当我运行时,它会使属性为空,但不会在属性中反映出来。因此,我不断看到需要空占位符的图像。 我该如何处理? 问题答案: 这是ngSrc和ngHref指令的预期行为。这些指令仅支持识别新路径,但是当路径不可用时,这些指令将以静默方式退出(我在这里看到一个拉取请求。)。 因此,当图像变量不再可用时,可能的解决方法是将ngSho

  • 问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如

  • UserViewModel: 用户存储库: