因此,我有數據庫,其中包含幾個參數表,其中之一是「類型」(TEXT)。林填充的ComboBox這個「型」用這種方法:JavaFX 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);
}
然後我用這個組合框來顯示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的第一選擇是空的(我沒有得到任何例外壽)。之後的第一選擇一切開始正常工作......
如果調試,是呼籲第一次更新了'changed'方法? IE:你實際上是否收到一個更改事件,並且加載方法不起作用,或者組合框沒有報告什麼問題? – Ironcache