2016-12-01 83 views
1

因此,我有数据库,其中包含几个参数表,其中之一是“类型”(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的第一选择是空的(我没有得到任何例外寿)。之后的第一选择一切开始正常工作......

+0

如果调试,是呼吁第一次更新了'changed'方法? IE:你实际上是否收到一个更改事件,并且加载方法不起作用,或者组合框没有报告什么问题? – Ironcache

回答

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

考虑加入后的产品建立监听器(更好的是,在其中创建组合框),并看看是否有帮助:

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

那么,我正在通过ComboBox onAction(在Scene Builder中)调用choiceType方法。 Iv完成像你建议的,将它移入loadTypefromDB() 现在它工作正常。谢谢! – AGasior

+1

如果需要,您仍然可以使用SB的'onAction'调用来调用'choiceType'方法,但是如果这样做,**不会在'choiceType'方法中创建一个更改侦听器。从SB **链接的'onAction'是你的变化监听器。相反,在'choiceType'方法中,检查组合框的当前值,并将该值传递到'load ...(String)'方法中。 – Ironcache