【问题标题】:How to replace ListView's list by a new list如何用新列表替换 ListView 的列表
【发布时间】:2019-06-20 14:21:04
【问题描述】:

我现在在 ListView 上工作了几个小时,它会根据 ChoiceBox 的更改进行更新。所以,我想选择一组用户(用户组的名称显示在选择框中)并且选择框侦听器从数据库中获取所有用户名,将其写入一个新列表并将其提供给我现在想要的 ListView改变。第一次可以正常使用,但我不能再次更改它。

首先,我的 ListView 由 SceneBuilder2.0 创建的 FXML 文件集成。那没有用。所以我检查了互联网,并认为我可以通过 = new ListView() 创建一个新的 ListView 对象,但是当 Scenebuilder 创建 ListView 时,这将不起作用。所以我通过 Scenebuilder 创建了一个窗格,手动添加了 ListView 并通过 .getChildren().add(listView) 将其添加到窗格中。那也不起作用,或者假设我仍然得到相同的结果。

我试图编辑 ListView 后面的 ArrayList,但我读到我不应该这样做。于是我改了ObservableList,也没有成功。所以我目前没有想法。在我下面的代码中,选择框(框)有自己的列表,它工作正常(因为我不需要更改它)。通过更改 box-item,它将检查现在应该显示在列表中的玩家组的数据库。从数据库中检索列表工作正常,但不会更改 ListView。如果我只是通过 setItems() 重置 ListView,我会得到奇怪的输出。如果我先 .clear() 然后 .setItems() 我有 NullpointerException。

所以我认为重绘可能有问题?可以吗?谢谢你的帮助。这是我现在最新的一段代码,但我也尝试了其他几种方法来使它工作。

box.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
    @Override
    public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
        String selection = box.getItems().get(newValue.intValue());
        GetDataDB dbGet = new GetDataDB();
        playerList = FXCollections.observableArrayList(dbGet.getPlayerListForTourGrpFromDB(selection));
        setPlayerList(playerList);
    }   
});

public void initListPanes() {
    // called at the initialization of the object
    playerListView = new ListView<>();
    playerPane.getChildren().add(playerListView);
}

public void setPlayerList(ObservableList<Player> playerList) {
    playerListView = new ListView<>();
    playerListView.setItems(playerList);
    playerListView.setCellFactory(playerView -> new PlayerListViewCell());
}

【问题讨论】:

  • edit 您的问题提供minimal reproducible example 演示该问题。您已经描述了很多方法以及它们如何不起作用,但向我们展示一个最小但完整的示例将帮助我们了解为什么它不起作用,并可能提供适当的解决方案。跨度>
  • 感谢您的快速回复。周末一有空,我就会改变它,并尝试听从你的建议。 :)
  • “setItems()”和“getItems.setAll()”方法应该可以正常工作,检查函数是否真的被调用并且提供的列表不为空。

标签: java listview javafx


【解决方案1】:

感谢 Slaw,通过创建最小的可重现示例,我设法让它工作。所以我的项目内部的逻辑可能有问题。

您可以在下面找到完全符合我要求的项目代码: ChoiceBox 更改 ListView 的列表。

    @FXML
    private ListView<String> listView;
    @FXML
    private ChoiceBox<String> box;
    ObservableList<String> observableListViewList;
    ObservableList<String> observableChoiceBoxList;
    ArrayList<String> maleArrayList;
    ArrayList<String> femaleArrayList;
    ArrayList<String> choiceBoxArrayList;

    public void initLists() {
        // choice box init
        choiceBoxArrayList = new ArrayList<>();
        choiceBoxArrayList.add("Male");
        choiceBoxArrayList.add("Female");
        observableChoiceBoxList = FXCollections.observableArrayList(choiceBoxArrayList);
        box.setItems(observableChoiceBoxList);

        // arrayList for ListView
        maleArrayList = new ArrayList<>();
        maleArrayList.add("Karsten");
        maleArrayList.add("Jochen");
        maleArrayList.add("Bryan");

        femaleArrayList = new ArrayList<>();
        femaleArrayList.add("Ingrid");
        femaleArrayList.add("Mathilda");
        femaleArrayList.add("Christi");

        box.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
            @Override
            public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {

                String selection = observableChoiceBoxList.get(newValue.intValue());
                if(selection.equals("Male")) {
                    observableListViewList = FXCollections.observableArrayList(maleArrayList);
                    listView.setItems(observableListViewList);
                } else if(selection.equals("Female")) {
                    observableListViewList = FXCollections.observableArrayList(femaleArrayList);
                    listView.setItems(observableListViewList);
                }
            }
        });
    }

【讨论】:

    猜你喜欢
    • 2017-04-05
    • 1970-01-01
    • 2012-08-26
    • 2019-09-27
    • 2022-11-10
    • 2023-04-11
    • 1970-01-01
    • 2011-12-07
    • 1970-01-01
    相关资源
    最近更新 更多