将项目添加到可观察列表中的JavaFX ListView并不反映更改并且无法选择

时间:2016-08-28 22:49:43

标签: java listview user-interface javafx listviewitem

我使用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发生了​​什么。

enter image description here

希望它清楚。

1 个答案:

答案 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

中的列表同步