JavaFX ComboBox使用延迟

时间:2016-12-01 15:35:11

标签: sqlite javafx combobox

所以我有数据库,其中包含参数很少的表,其中一个是"类型" (文本)。我用这个"类型"填充ComboBox用这种方法:

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);
}

然后我使用此ComboBox在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());
        }
    });
}

这里是loadTypeDataFromDB方法,它使用所选参数

执行查询
 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);
}

它几乎可以正常工作。我运行我的应用程序,从ComboBox中选择一种类型,没有任何反应(TableView保持清晰)。然后我从这个ComboBox中选择其他类型,突然它在TableView中显示了这种类型的项目,从现在开始,我可以显示我想要的所有类型,一切正常。所以看起来ComboBox的第一选择是null(我没有任何例外)。在第一次选择后,一切都开始正常工作......

1 个答案:

答案 0 :(得分:1)

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

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作为输入;在收到活动之后之前,您是不是要设置听众?因为这肯定会解释为什么你没有看到第一个。

考虑在添加产品后设置监听器(更好的是,在创建ComboBox的地方),看看是否有帮助:

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());
        }
    });
}