如何在JavaFX中刷新ChoiceBox?

时间:2019-02-07 02:19:21

标签: javafx

添加新值后,我想刷新选择框。

我阅读了我在stackoverflow上发现的所有与此相关的主题,但这些主题均无效。

public void setNamesChoiceBoxes() {
    ArrayList<Worker> workers = new ArrayList<>();
    ArrayList<String> names = new ArrayList<>();

    workers = db.getWorkers();

    for (Worker i : workers) {
        String tmp = i.getName() + " (" + i.getID() + ")";
        names.add(tmp);
    }

    ArrayList<String> searchNames = new ArrayList<>(names);
    searchNames.add(0, "All");
    ObservableList<String> search = FXCollections.observableList(searchNames);
    searchNameChoiceBox.setItems(search);
    searchNameChoiceBox.setValue(search.get(0));


    ArrayList<String> addNames = new ArrayList<>(names);
    addNames.add(0, "");
    ObservableList<String> add = FXCollections.observableList(addNames);
    addNameChoiceBox.setItems(add);
    addNameChoiceBox.setValue(add.get(0));
}

@Override
public ArrayList<Worker> getWorkers() {
    ArrayList<Worker> workers = new ArrayList<>();
    String sql = "select * from names";

    try {
        ResultSet rs = statement.executeQuery(sql);
        while (rs.next()) {
            int id = rs.getInt("id");
            String name = rs.getString("name");
            workers.add(new Worker(id, name));
        }
    } catch (Exception ex) {
        System.out.println("Exception in class \"DB\" (\" public ArrayList<Worker> getWorkers()\" failed): " + ex);
    }
    return workers;
}

@FXML
public void addNewWorkerButton(ActionEvent event) {
    String name = workerNameTextField.getText();
    workerNameTextField.setText("");
    db.addWorker(name);
    addWorkerAnchorPane.setVisible(false);
    mainAnchorPane.setOpacity(1);
    mainAnchorPane.setDisable(false);

    setNamesChoiceBoxes();
}

我在启动程序时从数据库中获取工作人员名称,它可以正常运行。当我向数据库添加新名称并调用“ setNamesChoiceBoxes”方法(以从数据库刷新选择框)时,它会产生很多错误,尽管新名称位于选择框列表中,但“ searchNameChoiceBox”值应为“全部”,但为“”。

添加新名称后,选择框如下所示:https://imgur.com/a/N4JarK7

应该是这样的...(因为我在方法中将值设置为“ All” ...):https://imgur.com/a/ZAEB7A3

1 个答案:

答案 0 :(得分:0)

我想我知道您希望选择一个特定项目并显示在ChoiceBox中?

如果是这样,我建议删除此行(与其他Box类似):

 //addNameChoiceBox.setValue(add.get(0));

并改用要显示的商品的真实选择。这将选择第一个项目:

addNameChoiceBox.getSelectionModel().select(0);

或者,有一种单独的方法也可以选择第一个项目:

addNameChoiceBox.getSelectionModel().selectFirst();

然后再次,您可能要选择按值显示的项目:

addNameChoiceBox.getSelectionModel().select("All"); //or whatever value you want to select.

我希望这至少可以帮助您解决部分问题。