JavaFX ListView 将项目添加到可观察列表中不反映更改并且不可选择
JavaFX ListView adding item into observable list doesn't reflect change and it's not selectable
我 运行 我的 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 的大小并且我能够看到列表中的项目我不能 select 它我必须再次调用 construstor 和 initializer 才能 select 这个物品。我从未遇到过这种行为,我该如何解决这些问题?
刷新列表中的项目时出现问题:我已经尝试删除项目并重新设置它们,这个问题的其他一些常见解决方案即使我设置了 setItems 也没有任何效果(null) 我无法让它工作,项目仍然存在。
最新插入的项目无法 select(通过 UI),直到我再次调用我的控制器并重新创建所有内容。我有这个项目 select 代码。
listViewLoadouts.getSelectionModel().select(loadoutToBeStored);
这实际上 select 需要的项目 兄弟我在 UI 中没有看到任何反馈,我不能 select它与我的鼠标。即使我删除了这一行,在我再次调用我的视图(构造函数和初始化程序)之前,我仍然无法用鼠标 select 它。
我知道这是一个有点复杂的问题,所以我决定用 gif 向您展示发生了什么。
希望清楚。
FXCollections.observableList 的 Javadoc 指出:
Note that mutation operations made directly to the underlying list are not reported to observers of any ObservableList that wraps it.
因此 loadoutList
在创建后未连接到 CsgoRr.getModel().getLoadoutCache()
中的列表。这意味着当 newLoadoutOnAction()
调用时:
CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored);
它没有被 loadoutList
或监视它的 ListView 拾取。如果您将 CsgoRr.getModel().getLoadoutCache()
更改为使用 ObservableList,并将其直接分配给 loadoutList
,您的函数应该可以正常工作。
另一种选择是将您的 loadoutToBeStored
添加到 loadoutList
,但是您还需要与 CsgoRr.getModel()
中的列表同步
我 运行 我的 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 的大小并且我能够看到列表中的项目我不能 select 它我必须再次调用 construstor 和 initializer 才能 select 这个物品。我从未遇到过这种行为,我该如何解决这些问题?
刷新列表中的项目时出现问题:我已经尝试删除项目并重新设置它们,这个问题的其他一些常见解决方案即使我设置了 setItems 也没有任何效果(null) 我无法让它工作,项目仍然存在。
最新插入的项目无法 select(通过 UI),直到我再次调用我的控制器并重新创建所有内容。我有这个项目 select 代码。
listViewLoadouts.getSelectionModel().select(loadoutToBeStored);
这实际上 select 需要的项目 兄弟我在 UI 中没有看到任何反馈,我不能 select它与我的鼠标。即使我删除了这一行,在我再次调用我的视图(构造函数和初始化程序)之前,我仍然无法用鼠标 select 它。
我知道这是一个有点复杂的问题,所以我决定用 gif 向您展示发生了什么。
希望清楚。
FXCollections.observableList 的 Javadoc 指出:
Note that mutation operations made directly to the underlying list are not reported to observers of any ObservableList that wraps it.
因此 loadoutList
在创建后未连接到 CsgoRr.getModel().getLoadoutCache()
中的列表。这意味着当 newLoadoutOnAction()
调用时:
CsgoRr.getModel().getLoadoutCache().add(loadoutToBeStored);
它没有被 loadoutList
或监视它的 ListView 拾取。如果您将 CsgoRr.getModel().getLoadoutCache()
更改为使用 ObservableList,并将其直接分配给 loadoutList
,您的函数应该可以正常工作。
另一种选择是将您的 loadoutToBeStored
添加到 loadoutList
,但是您还需要与 CsgoRr.getModel()