我使用ListView遇到了相当混乱的行为,我在控制器中创建了listview并附加了数据。
@FXML
private ListView<Weapon> listViewWeapons;
...
private final ObservableList<Loadout> loadoutList;
public LoadoutViewController() {
...
loadoutList =FXCollections.observableList(CsgoRr.getModel().getLoadoutCache());
...
}
@Override
public void initialize(URL location, ResourceBundle resources) {
...
listViewLoadouts.setItems(loadoutList);
...
}
我调用附加到按钮的方法,它具有向列表中添加新装载的功能
@FXML
private void newLoadoutOnAction() {
try {
Loadout loadoutToBeStored = new Loadout(new Long[10], "Loadout" + newDuplicateNameLoadoutIncrement);
loadoutToBeStored.setId(DbUtil.storeLoadout(loadoutToBeStored));//store and set id.
CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored);
System.out.println("Stored new loadout ");
listViewLoadouts.getSelectionModel().select(loadoutToBeStored);
for (Loadout loadout : loadoutList) {
System.out.println("DEBUG LOADOUT CONTAINER OBSERVABLE:" + loadout);
}
} catch (SQLException ex) {//duplicate name
if (ex.getErrorCode() == 23505) {
newDuplicateNameLoadoutIncrement++;
newLoadoutOnAction();
}
Logger.getLogger(LoadoutViewController.class.getName()).log(Level.SEVERE, null, ex);
}
}
所有数据都已正确加载和存储,我已经调试了那部分内容。但即使我调用方法newLoadoutOnAction并将数据放入可观察列表引用的列表中,在我调整listView的大小之前不会看到更改。这不是唯一的问题,即使在我调整listView的大小并且我能够看到列表中的项目后我也无法选择它我必须再次调用construstor和initializer才能选择此项项目。我从未遇到过这种行为,我该如何解决这些问题?
列表中刷新项目的问题:我试图删除项目并再次设置它们,并且这个问题常见的一些其他解决方案没有任何效果,即使我把setItems(null)我可以& #39;让它工作,物品仍在那里。
插入的最新项目(通过UI),直到我再次调用我的控制器并重新创建所有内容。我已经用代码选择了这个项目。
listViewLoadouts.getSelectionModel().select(loadoutToBeStored);
实际选择了所需的项目芽我没有在UI中看到任何反馈,我无法用鼠标选择它。即使我删除了这一行,我仍然无法用鼠标选择它,直到我再次调用我的视图(构造函数和初始化程序)。
我知道这是一个更复杂的问题所以我决定告诉你gif发生了什么。
希望它清楚。
答案 0 :(得分:3)
FXCollections.observableList州的Javadoc:
请注意,直接对基础列表进行的变异操作不会报告给包装它的任何ObservableList的观察者。
出于这个原因, public static native void anim()
/*-{
js here
}-*/;
在创建后未连接到loadoutList
中的列表。这意味着当CsgoRr.getModel().getLoadoutCache()
调用时:
newLoadoutOnAction()
{p>没有被CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored);
或者ListView观看它。如果您更改loadoutList
以使用ObservableList,并将其直接分配给CsgoRr.getModel().getLoadoutCache()
,则您的功能应该可以正常工作。
另一种选择是将您的loadoutList
添加到loadoutToBeStored
,但是您还需要与loadoutList