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

中的列表同步