Sqlite JavaFX组合框使用延迟

Sqlite JavaFX组合框使用延迟,sqlite,javafx,combobox,Sqlite,Javafx,Combobox,所以我有一个数据库,它包含一个只有很少参数的表,其中一个是“type”(文本)。Im使用以下方法使用此“类型”填充组合框: public void loadTypefromDB() { types = FXCollections.observableArrayList(); try{ ResultSet rs = conn.createStatement().executeQuery("SELECT type FROM Products"); wh

所以我有一个数据库,它包含一个只有很少参数的表,其中一个是“type”(文本)。Im使用以下方法使用此“类型”填充组合框:

public void loadTypefromDB()
{
    types = FXCollections.observableArrayList();
    try{
        ResultSet rs = conn.createStatement().executeQuery("SELECT type FROM Products");
        while(rs.next()){
            String product = rs.getString("type");
            types.add(product);
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    choiceBox.setItems(types);
}
然后我使用这个组合框在TableView中显示所选类型的所有项目

public void choiceType(ActionEvent event)
{
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            loadTypeDataFromDB(newValue.toString());
        }
    });
}
公共作废选项类型(ActionEvent事件)
{
choiceBox.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void已更改(observeValue您的ChangeListener设置对我来说似乎可疑,可能是您的问题的根源(不过,如果没有看到更多代码,我无法确定):

公共作废选项类型(ActionEvent事件)
{
choiceBox.getSelectionModel().SelectEditeProperty().addListener(新的ChangeListener()){
@凌驾

public void changed(ObservableValueIf您调试时,是否在第一次更新时调用了
changed
方法?即:您是否确实收到了一个更改事件且加载方法不起作用,或者是组合框没有报告任何内容的问题?嗯,我是通过组合框onAction(在场景生成器中)调用choiceType方法的.Iv按照u的建议执行,将其从DB()移动到loadTypefromDB()中现在它可以正常工作了。谢谢!如果您愿意,您仍然可以使用来自SB的
onAction
调用
choiceType
方法,但是,如果您这样做,请不要在
choiceType
方法中创建更改侦听器。来自SB的
onAction
链接是您的更改侦听器。相反,在
choiceType
方法,检查组合框的当前值,并将该值传递到
load…(String)
方法中。
 public void loadTypeDataFromDB(String type){
    products = FXCollections.observableArrayList();

    try {
        PreparedStatement pst =  conn.prepareStatement("SELECT name, kcal, protein, carb, fat FROM Products WHERE type=?");
        pst.setString(1, type);
        ResultSet rs = pst.executeQuery();

        while(rs.next()){
            products.add(new productData(rs.getString("name"), rs.getString("kcal"), rs.getString("protein"), rs.getString("carb"), rs.getString("fat")));
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }

    colProduct.setCellValueFactory(new PropertyValueFactory<productData, String>("name"));
    colKcal.setCellValueFactory(new PropertyValueFactory<productData, String>("kcal"));
    colProtein.setCellValueFactory(new PropertyValueFactory<productData, String>("protein"));
    colCarbs.setCellValueFactory(new PropertyValueFactory<productData, String>("carb"));
    colFat.setCellValueFactory(new PropertyValueFactory<productData, String>("fat"));

    tableProduct.setItems(null);
    tableProduct.setItems(products);
}
public void choiceType(ActionEvent event)
{
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            loadTypeDataFromDB(newValue.toString());
        }
    });
}
public void loadTypefromDB()
{
    types = FXCollections.observableArrayList();
    try{
        ResultSet rs = conn.createStatement().executeQuery("SELECT type FROM Products");
        while(rs.next()){
            String product = rs.getString("type");
            types.add(product);
        }
    }
    catch (SQLException e) {
        e.printStackTrace();
    }
    choiceBox.setItems(types);
    choiceBox.getSelectionModel().selectedItemProperty().addListener(new ChangeListener<String>() {
        @Override
        public void changed(ObservableValue<? extends String> observable, String oldValue, String newValue) {
            loadTypeDataFromDB(newValue.toString());
        }
    });
}