首页 > 解决方案 > 更改组合框的值后重新加载组合框

问题描述

初始化线程时,我正在使用从 sql 数据库中获取的项目填充组合框。

如果有人感兴趣:

public void initialize(URL arg0, ResourceBundle arg1)  {
    if(arr != null || arr.length > 0) {
        for(int i = 0; i<arr.length; i++) {
            cmBox.getItems().add(arr[i]);
        }
    }
}

我有一部分代码向 sql 表添加了一个新值,并且我想在发生这种情况时重新填充组合框。

如果我做:

    cmBox.getItems().clear();
    arr = sqld.selectAll();

    if(arr != null || arr.length > 0) {
        for(int i = 0; i<arr.length; i++) {
            cmBox.getItems().add(arr[i]);
        }
    }

它工作正常,但除非我关闭并重新打开显示组合框的窗口,否则我看不到新的更改。

没有错误或任何东西,只是寻找重新加载组合框的创造性方法并让它实际显示更新的值,而无需手动关闭和重新打开窗口。

标签: javafxcombobox

解决方案


当您将“新值添加到 sql 表”时,您不需要运行刷新按钮,comboBox.setItems(...)这应该更新组合框这里是一个示例

public class Main extends Application {

    private int[] data;
    private int dataCount = 0;

    @Override
    public void start(Stage primaryStage) throws Exception{
        data = randomizeData(dataCount);

        ComboBox comboBox = new ComboBox();
        comboBox.setItems(FXCollections.observableArrayList(
                Arrays.stream(data).boxed().collect(Collectors.toList())));

        Button updateDataButton = new Button("Update values in SQL Table");
        updateDataButton.setOnAction(event -> {
                //Update your SQL data
                updateData();

                //Refresh List
                comboBox.setItems(FXCollections.observableArrayList(
                        Arrays.stream(data).boxed().collect(Collectors.toList())));
        });

        VBox vBox = new VBox();
        vBox.setAlignment(Pos.CENTER);
        vBox.getChildren().addAll(comboBox, updateDataButton);

        Scene scene = new Scene(vBox);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    private int[] randomizeData(int additional){
        int[] data = new int[5+additional];
        for (int i = 0; i < data.length; i++) {
            data[i] = (int) (Math.random()*10);
        }
        return data;
    }

    private void updateData(){
        data = randomizeData(++dataCount);
    }

    public static void main(String[] args) { launch(args); }
}

推荐阅读