我的问题是,当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);
}
});
通过以下线程的帮助回答我自己的问题: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一样。
我有一个表视图,每次都很好地填充, 我的主控制器: 我的测试类: 扩展测试类并覆盖其运行的Test1类: 我的aHandler: 因为tbl1绑定到Handler。getInstance()。GetData(),第一次初始化该类时,我看到列Test填充了值1,因为TestData=1;但当计时器开始更改测试数据时,表视图不会获得新的赋值。我做错了什么? 我尽我所能解释这个问题,请让我知道,如果它仍
问题内容: 仅在真正更改数据的情况下,才有可能使用“更新后”触发器。我知道“新旧”。但是使用它们时,我只能比较列。例如“ NEW.count <> OLD.count”。 但我想要类似的东西:如果“ NEW <> OLD”,则运行触发器 一个例子: 关键是,有一个更新,但是 什么都没有改变 。但是无论如何,触发器都在运行。恕我直言,应该有一个没有的方法。 我知道我可以使用 如果现在b <> OLD
问题内容: 新手有问题,请保持温柔: 结果是: 我不明白为什么列表改变时,我只是在做,没有。我什至不知道要用什么搜索词来弄清楚。 问题答案: 这是因为在进行分配后,和都引用相同的列表。 尝试执行以下操作以查看它们是指相同的对象还是不同的对象: 一个例子: 如果您确实要创建这样的重复副本,而不是引用原始列表,而是引用列表的副本,请使用slice运算符: 一个例子: 另外,请勿将其用作变量名,因为最初
问题内容: 我用来加载图像。值是从一些范围变量加载的,如下所示: 我的问题是,当我运行时,它会使属性为空,但不会在属性中反映出来。因此,我不断看到需要空占位符的图像。 我该如何处理? 问题答案: 这是ngSrc和ngHref指令的预期行为。这些指令仅支持识别新路径,但是当路径不可用时,这些指令将以静默方式退出(我在这里看到一个拉取请求。)。 因此,当图像变量不再可用时,可能的解决方法是将ngSho
问题内容: 我尝试编写一个小指令,以将其内容包装在另一个模板文件中。 这段代码: 应该有以下输出: 因为布局“默认”具有以下代码: 这里的指令代码: }); 我的问题: 例如,当我在模板(在布局模板中或在布局标签内部)中使用范围变量时。它只是最初工作。如果我更新变量,则该指令不再更新。整个链接功能只会被触发一次。 我认为,AngularJS不知道,该指令使用范围变量,因此不会被更新。但是我不知道如
我想使用JavaFX ListView控件显示一个人员列表(在POJOS中编码,包含一个name和surname属性)。我创建了ListView,并将persons列表添加为ObservableList。如果我在ObservableList中删除或添加一个新人,那么一切都可以正常工作,但是POJO中的更改不会触发ListView的更新。我必须从ObservableList中移除和添加修改后的POJ